我添加了一张表,但现在不再需要它了。该如何删除这个表?
我已经运行了迁移,所以这个表已经存在于我的数据库中。我认为rails generate migration
应该可以处理这个问题,但我还没有找到具体方法。
我尝试过:
rails generate migration drop_tablename
但那只生成了一个空的迁移。
在Rails中删除表的“官方”方法是什么?
我添加了一张表,但现在不再需要它了。该如何删除这个表?
我已经运行了迁移,所以这个表已经存在于我的数据库中。我认为rails generate migration
应该可以处理这个问题,但我还没有找到具体方法。
我尝试过:
rails generate migration drop_tablename
但那只生成了一个空的迁移。
在Rails中删除表的“官方”方法是什么?
有时候你不能简单地生成已经包含你想要的代码的迁移文件。你可以创建一个空的迁移文件,然后填充你需要的代码。
你可以在这里找到关于如何完成不同任务的迁移文件的信息:
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
更具体地,你可以看到如何使用下面的方法删除一个表:
drop_table :table_name
手动编写迁移。例如运行rails g migration DropUsers
。
至于迁移的代码,我将引用Maxwell Holder的文章《Rails 迁移清单》
rake db:migrate
然后 rake db:rollback
将会失败class DropUsers < ActiveRecord::Migration
def change
drop_table :users
end
end
class DropUsers < ActiveRecord::Migration
def up
drop_table :users
end
def down
fail ActiveRecord::IrreversibleMigration
end
end
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :email, null: false
t.timestamps null: false
end
end
end
schema.rb
中进行剪切和粘贴,请不要忘记还要在schema.rb
中搜索外键。然后将外键定义添加到drop_table
块中,例如:t.foreign_key "other_table"
。 - Lencho Reyes首先生成一个空的迁移,可以随意命名。这样做很重要,因为它会创建适当的日期。
rails generate migration DropProductsTable
这将会在/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
我所做的唯一更改是添加了 drop_table :products
和 raise ActiveRecord::IrreversibleMigration
。
然后运行 rake db:migrate
,它将帮助您删除该表。
def change;
drop_table :products do |t|;
t.string :product_name, null: false;
t.timestamps null: false;
end;
end;
- user3402754rails destroy model User
命令。 - gm2008您需要使用以下命令创建一个新的迁移文件
rails generate migration drop_table_xyz
在新生成的迁移文件(db/migration/xxxxxxx_drop_table_xyz)中编写删除表格的代码,例如:
and write drop_table code in newly generated migration file (db/migration/xxxxxxx_drop_table_xyz) like
drop_table :tablename
如果您想在不进行迁移的情况下删除表格,只需打开Rails控制台:
$ rails c
并执行以下命令
ActiveRecord::Base.connection.execute("drop table table_name")
或者您可以使用更简化的命令
ActiveRecord::Migration.drop_table(:table_name)
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
简单且官方的做法就是这样:
rails g migration drop_tablename
现在前往你的 db/migrate 目录并查找包含 drop_tablename 作为文件名的文件,将其编辑为以下内容。
def change
drop_table :table_name
end
然后你需要运行
rake db:migrate
在您的控制台上。
我无法使用迁移脚本让它工作,所以我选择了这个解决方案。在终端中使用Rails控制台:
rails c
类型
ActiveRecord::Migration.drop_table(:tablename)
这对我很有效。这将删除以前的表格。别忘了运行。
rails db:migrate
你可以在Rails控制台中简单地删除一个表格。 首先打开控制台。
$ rails c
然后将此命令粘贴到控制台中
ActiveRecord::Migration.drop_table(:table_name)
将 table_name 替换为您要删除的表名。
您还可以直接从终端删除表。只需进入应用程序的根目录并运行此命令即可。
$ rails runner "Util::Table.clobber 'table_name'"
我认为,要完全符合“官方”标准,您需要创建一个新的迁移,并将drop_table放在self.up中。然后,self.down方法应包含重新创建整个表所需的所有代码。可以假设该代码只需从创建迁移时的schema.rb文件中获取。
看起来有点奇怪,因为您要添加创建一个明知道不再需要的表的代码,但这将使所有迁移代码完整和“官方”,对吗?
我刚刚为我需要删除的一个表执行了此操作,但老实说,我没有测试“down”,也不确定为什么要这样做。
raise ActiveRecord::IrreversibleMigration
,这样如果你尝试回滚操作时,至少会给自己一个错误提示或通知。 - Steph RoseCreateMyTable.up
和 ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)
,其中 X 是最初创建表的迁移,但两者都不起作用 - 在这两种方法中,AR 首先检查迁移是否已经应用,并在已应用时静默跳过它。 - Isaac Betesh
rails generate migration
具有用于生成创建表、添加或更改列等迁移代码的命令行选项,因此如果它还有一个删除表的选项就好了——但它没有。当然,编写“up”部分很简单——只需调用drop_table
即可——但是“down”部分,重新生成表可能并不总是那么简单,特别是如果该表的模式在初始创建后被迁移更改了。也许应该建议Rails的开发人员添加这样一个选项是个好主意。 - Teemu Leistirake
迁移创建命令,并附带一个表名作为参数,就可以生成所需的up
和down
函数。 - Teemu Leisti