Rails数据库迁移 – 如何删除表?
我添加了一张我认为需要的表格,但现在不再计划使用它了。 我应该如何删除该表?
我已经运行迁移,所以表在我的数据库。 我想rails generate migration
应该能够处理这个,但我还没有想出如何。
我试过了:
rails generate migration drop_tablename
,
但是这只是产生了一个空的迁移。
在Rails中放置表的“官方”方式是什么?
你不会总是能够简单地生成迁移到已经有你想要的代码。 你可以创build一个空的迁移,然后用你需要的代码填充它。
您可以在这里find有关如何完成不同任务的信息:
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
更具体地说,您可以看到如何使用以下方法删除表:
drop_table :table_name
首先用你想要的任何名字生成一个空的迁移。 这样做很重要,因为它会创build适当的date。
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
,它会为你删除表。
手动编写您的迁移。 例如运行rails g migration DropUsers
。
至于迁移的代码,我只会引用Maxwell Holder的postRails Migration Checklist
坏 – 运行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
虽然在这里提供的答案正常工作,我想要更直接的东西,我发现它在这里: 链接首先进入轨道控制台:
$rails console
然后input:
ActiveRecord::Migration.drop_table(:users)
其中:users
是表名。 做完了,为我工作!
您需要使用以下命令创build新的迁移文件
rails generate migration drop_table_xyz
并在新生成的迁移文件(db / migration / xxxxxxx_drop_table_xyz)中写入drop_table代码
drop_table :tablename
或者,如果你想删除没有迁移的表,只需打开rails控制台
$ rails c
并执行以下命令
ActiveRecord::Base.connection.execute("drop table table_name")
或者你可以使用更简化的命令
ActiveRecord::Migration.drop_table(:table_name)
- rails g迁移drop_users
- 编辑迁移
class DropUsers < ActiveRecord::Migration def change drop_table :users do |t| t.string :name t.timestamps end end end
- 耙db:迁移
我认为,要完全“正式”,您需要创build一个新的迁移,并将drop_table放在self.up中。 self.down方法应该包含所有代码来完整地重新创build表。 据推测,这个代码可以在创build迁移时从schema.rb中获取。
看起来有点奇怪,你可以使用代码来创build一个你不再需要的表,但是这样可以保证所有的迁移代码都是完整的,并且是“正式的”,对吗?
我只是做了这个表,我需要放弃,但老实说,没有testing“下”,不知道为什么我会。
你可以简单地从轨道控制台中删除一个表。 首先打开控制台
$ rails c
然后将此命令粘贴到控制台中
ActiveRecord::Migration.drop_table(:table_name)
将table_namereplace为要删除的表。
您也可以直接从terminal下载表格。 只需input您的应用程序的根目录并运行此命令
$ rails runner "Util::Table.clobber 'table_name'"
打开你的轨道控制台
ActiveRecord::Base.connection.execute("drop table table_name")
ActiveRecord::Base.connection.drop_table :table_name
运行这个命令: –
$ rails g迁移drop_table_name
然后:
$ rake db:migrate
或者如果你正在使用MySql数据库,那么:
- login数据库
- 显示数据库;
- 显示表格;
- drop table_name;
如果你还没有处于发展的早期阶段,那么到目前为止,这并不是最好的解决scheme。
发展ENV。 您可以从(db/migrate/name_of_migrated_file)
删除已迁移的文件。
rake db:drop rake db:create #This is unnecessary if using SQlite, but useful sometimes. rake db:migrate #or rake db:migrate:reset
您可以按照指南中的方式回滚迁移:
http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations
生成迁移:
rails generate migration revert_create_tablename
编写迁移:
require_relative '20121212123456_create_tablename' class RevertCreateTablename < ActiveRecord::Migration[5.0] def change revert CreateTablename end end
这样,你也可以回滚,并可以用来恢复任何迁移
简单和正式的方式是这样的:
rails g migration drop_tablename
现在进入你的数据库/迁移并查找包含drop_tablename作为文件名的文件,并对其进行编辑。
def change drop_table :table_name end
那么你需要运行
rake db:migrate
在你的控制台上。
我需要删除我们的迁移脚本以及表本身…
class Util::Table < ActiveRecord::Migration def self.clobber(table_name) # drop the table if ActiveRecord::Base.connection.table_exists? table_name puts "\n== " + table_name.upcase.cyan + " ! " << Time.now.strftime("%H:%M:%S").yellow drop_table table_name end # locate any existing migrations for a table and delete them base_folder = File.join(Rails.root.to_s, 'db', 'migrate') Dir[File.join(base_folder, '**', '*.rb')].each do |file| if file =~ /create_#{table_name}.rb/ puts "== deleting migration: " + file.cyan + " ! " << Time.now.strftime("%H:%M:%S").yellow FileUtils.rm_rf(file) break end end end def self.clobber_all # delete every table in the db, along with every corresponding migration ActiveRecord::Base.connection.tables.each {|t| clobber t} end end
从terminal窗口运行:
$ rails runner "Util::Table.clobber 'your_table_name'"
要么
$ rails runner "Util::Table.clobber_all"
你能做的最好的方法是
rails g migration Drop_table_Users
然后执行以下操作
rake db:migrate
跑
rake db:migrate:down VERSION=<version>
其中<version>
是您要恢复的迁移文件的版本号。
例:-
rake db:migrate:down VERSION=3846656238