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)
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 :products
和raise ActiveRecord::IrreversibleMigration
.
然后跑rake db:migrate
,它会为你放下桌子.
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)
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)
完成了,为我工作!
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
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)
Fra*_*ter 13
我认为,要完全"正式",您需要创建一个新的迁移,并将drop_table放在self.up中.然后,self.down方法应包含所有代码以完整地重新创建表.据推测,您可以在创建迁移时从schema.rb中获取代码.
看起来有点奇怪,要放入代码来创建一个你知道你不再需要的表,但这样可以保持所有的迁移代码完整并且"正式",对吧?
我只是为了一个我需要放弃的桌子做了这个,但老实说没有测试"向下"并且不确定为什么我愿意.
小智 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
然后在命令行中运行,这应该删除安装表解决方案在这里找到
您可以按照指南中的方式回滚迁移:
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)
这样您也可以回滚并可以用来还原任何迁移
简单而官方的方式是:
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)
在你的控制台上.
打开你的rails控制台
ActiveRecord::Base.connection.execute("drop table table_name")
Run Code Online (Sandbox Code Playgroud)
我无法使其与迁移脚本一起使用,因此我继续使用此解决方案。使用终端输入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
替代引发异常或尝试重新创建现在空表 - 同时仍然启用迁移回滚,重做等 -
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
Run Code Online (Sandbox Code Playgroud)