Rails数据库迁移 - 如何删除表?

Jas*_*orn 483 database migration rake ruby-on-rails ruby-on-rails-3

我添加了一张我认为我需要的表格,但现在不再计划使用它了.我该如何删除该表?

我已经运行了迁移,因此该表位于我的数据库中.我认为rails generate migration应该能够解决这个问题,但我还没弄清楚怎么做.

我试过了:

rails generate migration drop_tablename
Run Code Online (Sandbox Code Playgroud)

但那只是一个空的迁移.

在Rails中删除表的"官方"方法是什么?

Pet*_*ete 624

您并不总是能够简单地生成迁移到已经拥有所需的代码.您可以创建一个空迁移,然后使用您需要的代码填充它.

您可以在此处找到有关如何在迁移中完成不同任务的信息:

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

更具体地说,您可以使用以下方法查看如何删除表:

drop_table :table_name
Run Code Online (Sandbox Code Playgroud)

  • @BederAcostaBorges的[答案](/sf/ask/281409201/#31657066)更加不言自明,准确无误 (6认同)
  • 如果你已经完成了桌子并且不打算再使用它,我会说放弃它.如果不使用它,最好摆脱它. (3认同)
  • 这对我也有用.但是在完全迁移(从头开始安装)时,现在将首先创建表,然后再次删除.在路上删除创建和删除迁移是否安全? (2认同)
  • 这里有关于删除表或恢复到以前的数据库模式是否更好的任何视图? (2认同)
  • 如何删除所有外键?其他表中的列指向要删除的表. (2认同)

Bra*_*rke 346

首先使用您想要的任何名称生成空迁移.这样做非常重要,因为它创建了适当的日期.

rails generate migration DropProductsTable
Run Code Online (Sandbox Code Playgroud)

这将在/ db/migrate /中生成一个.rb文件,如20111015185025_drop_products_table.rb

现在编辑该文件如下所示:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end
Run Code Online (Sandbox Code Playgroud)

我添加的唯一的东西是drop_table :productsraise ActiveRecord::IrreversibleMigration.

然后跑rake db:migrate,它会为你放下桌子.

  • 应使用向下迁移来重新创建要删除的表. (14认同)
  • 即使在开发过程中,这种迁移也永远无法回滚。将向下迁移留空会更好吗? (2认同)
  • @mjnissim和fflyer05是正确的,为了避免任何奇怪的事情你应该在down方法中重新创建表. (2认同)
  • 删除表会删除所有数据,如果您使用down方法重新创建它,则将无法恢复它,因此实际上不是适当的回滚。最好清楚地表明迁移是不可逆的,而不是错误地认为可以从中进行恢复。 (2认同)

Bed*_*ges 300

手动编写迁移.比如跑rails g migration DropUsers.

至于迁移的代码,我只想引用Maxwell Holder的帖子Rails Migration Checklist

坏 - 运行rake db:migrate然后rake db:rollback会失败

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end
Run Code Online (Sandbox Code Playgroud)

好 - 揭示迁移不应该是可逆的意图

class DropUsers < ActiveRecord::Migration
  def up
    drop_table :users
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end
Run Code Online (Sandbox Code Playgroud)

更好 - 实际上是可逆的

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 如果您要从“schema.rb”剪切并粘贴到块中,请不要忘记在“schema.rb”中搜索外键。然后将外键定义添加到`drop_table`块中,例如:`t.foreign_key "other_table"` (4认同)
  • 我使用了第三个选项,它对我来说效果很好。谢谢。 (2认同)

lll*_*lll 192

虽然这里提供的答案工作正常,但我想要一些更"直截了当"的东西,我在这里找到它:link 首先进入rails console:

$rails console
Run Code Online (Sandbox Code Playgroud)

然后输入:

ActiveRecord::Migration.drop_table(:table_name)
Run Code Online (Sandbox Code Playgroud)

完成了,为我工作!

  • 仅当您想永久摆脱该表时才运行此命令。Rails 不会意识到这种下降。运行此命令后迁移中断。无法创建、删除...等。错误 SQLite3::SQLException:没有这样的表:应计:DROP TABLE“sometable” (3认同)

Sha*_*riq 36

您需要使用以下命令创建新的迁移文件

rails generate migration drop_table_xyz
Run Code Online (Sandbox Code Playgroud)

并在新生成的迁移文件(db/migration/xxxxxxx_drop_table_xyz)中编写drop_table代码

drop_table :tablename
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在不迁移的情况下删除表,只需打开rails console

$ rails c
Run Code Online (Sandbox Code Playgroud)

并执行以下命令

ActiveRecord::Base.connection.execute("drop table table_name")
Run Code Online (Sandbox Code Playgroud)

或者您可以使用更简化的命令

ActiveRecord::Migration.drop_table(:table_name)
Run Code Online (Sandbox Code Playgroud)


小智 21

  1. rails g migration drop_users
  2. 编辑迁移
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
Run Code Online (Sandbox Code Playgroud)
  1. rake db:migrate


Fra*_*ter 13

我认为,要完全"正式",您需要创建一个新的迁移,并将drop_table放在self.up中.然后,self.down方法应包含所有代码以完整地重新创建表.据推测,您可以在创建迁移时从schema.rb中获取代码.

看起来有点奇怪,要放入代码来创建一个你知道你不再需要的表,但这样可以保持所有的迁移代码完整并且"正式",对吧?

我只是为了一个我需要放弃的桌子做了这个,但老实说没有测试"向下"并且不确定为什么我愿意.

  • 或者您可以在self.down方法中使用:`raise ActiveRecord :: IrreversibleMigration`,如果您尝试回滚,最后给自己一个错误/通知. (7认同)
  • 我会测试下来只是因为否则我会在我的项目中引入未经测试的代码。如何重用原始迁移的 up 方法?我已经尝试过 `CreateMyTable.up` 和 `ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)`,其中 X 是最初创建表的迁移,但两种方法都不起作用, AR 首先检查是否已应用迁移,如果已应用则静默跳过。` (2认同)

小智 12

你可以简单地从rails控制台中删除一个表.首先打开控制台

$ rails c
Run Code Online (Sandbox Code Playgroud)

然后在控制台中粘贴此命令

ActiveRecord::Migration.drop_table(:table_name)
Run Code Online (Sandbox Code Playgroud)

table_name替换为要删除的表.

您也可以直接从终端删除表.只需输入应用程序的根目录并运行此命令即可

$ rails runner "Util::Table.clobber 'table_name'"
Run Code Online (Sandbox Code Playgroud)


小智 9

您不能简单地运行drop_table :table_name,而是可以通过运行以下命令来创建空迁移: rails g migration DropInstalls

然后您可以将其添加到该空迁移中:

class DropInstalls < ActiveRecord::Migration
  def change
    drop_table :installs
  end
end
Run Code Online (Sandbox Code Playgroud)

rails db:migrate然后在命令行中运行,这应该删除安装表解决方案在这里找到


Mat*_*lva 8

您可以按照指南中的方式回滚迁移:

http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations

生成迁移:

rails generate migration revert_create_tablename
Run Code Online (Sandbox Code Playgroud)

写下迁移:

require_relative '20121212123456_create_tablename'

class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end
Run Code Online (Sandbox Code Playgroud)

这样您也可以回滚并可以用来还原任何迁移


Mah*_*sta 8

简单而官方的方式是:

  rails g migration drop_tablename
Run Code Online (Sandbox Code Playgroud)

现在转到db/migrate并查找包含drop_tablename作为文件名的文件,并将其编辑为此文件.

    def change
      drop_table :table_name
    end
Run Code Online (Sandbox Code Playgroud)

然后你需要运行

    rake db:migrate 
Run Code Online (Sandbox Code Playgroud)

在你的控制台上.


man*_*yal 7

打开你的rails控制台

ActiveRecord::Base.connection.execute("drop table table_name")
Run Code Online (Sandbox Code Playgroud)


Sri*_*h V 7

我无法使其与迁移脚本一起使用,因此我继续使用此解决方案。使用终端输入rails console:

rails c
Run Code Online (Sandbox Code Playgroud)

类型

ActiveRecord::Migration.drop_table(:tablename)
Run Code Online (Sandbox Code Playgroud)

这对我来说很有用。这将删除上一个表。别忘了跑步

rails db:migrate
Run Code Online (Sandbox Code Playgroud)


小智 5

ActiveRecord::Base.connection.drop_table :table_name


小智 5

替代引发异常或尝试重新创建现在空表 - 同时仍然启用迁移回滚,重做等 -

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
Run Code Online (Sandbox Code Playgroud)