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 :productsraise 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) 
  1. rails g迁移drop_users
  2. 编辑迁移
  class DropUsers < ActiveRecord::Migration def change drop_table :users do |t| t.string :name t.timestamps end end end 
  1. 耙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数据库,那么:

  1. login数据库
  2. 显示数据库;
  3. 显示表格;
  4. 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