我添加了一个我认为自己需要的表,但现在不再计划使用它。我应该如何删除那张桌子?
我已经运行了迁移,因此该表位于数据库中。我认为rails generate migration
应该可以解决这个问题,但是我还没有弄清楚该怎么做。
我试过了:
rails generate migration drop_tablename
但这只是一个空的迁移。
在Rails中删除表的“官方”方法是什么?
rake
迁移创建命令,一个表作为参数的名称,这将产生所需要的up
和down
功能。
我添加了一个我认为自己需要的表,但现在不再计划使用它。我应该如何删除那张桌子?
我已经运行了迁移,因此该表位于数据库中。我认为rails generate migration
应该可以解决这个问题,但是我还没有弄清楚该怎么做。
我试过了:
rails generate migration drop_tablename
但这只是一个空的迁移。
在Rails中删除表的“官方”方法是什么?
rake
迁移创建命令,一个表作为参数的名称,这将产生所需要的up
和down
功能。
Answers:
您将无法始终仅生成迁移就已经拥有所需的代码。您可以创建一个空的迁移,然后用所需的代码填充它。
您可以在此处找到有关如何完成迁移中不同任务的信息:
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
更具体地说,您可以查看如何使用以下方法删除表:
drop_table :table_name
首先使用您想要的任何名称生成一个空迁移。这样做很重要,因为它会创建适当的日期。
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
,它将为您删除表格。
down
方法重新创建它,则将无法恢复它,因此实际上不是适当的回滚。最好清楚地表明迁移是不可逆的,而不是错误地认为可以从中进行恢复。
手动编写迁移。例如运行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"
尽管此处提供的答案正常运行,但我想要更多“简单易懂”的东西,但我在这里找到了:链接 首先进入rails控制台:
$rails console
然后输入:
ActiveRecord::Migration.drop_table(:table_name)
完成了,为我工作!
rails destroy model User
您需要使用以下命令创建新的迁移文件
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)
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
我认为,要完全“正式”,您需要创建一个新的迁移,并将drop_table放在self.up中。然后,self.down方法应包含所有代码以完全重新创建表。大概可以在创建迁移时从schema.rb中获取代码。
放一些代码来创建一个表,这看起来有点奇怪,您知道您不再需要该表了,但这将使所有迁移代码完整且“正式”,对吗?
我只是对需要删除的表进行了此操作,但老实说没有测试“下降”,并且不确定为什么会这样做。
raise ActiveRecord::IrreversibleMigration
在self.down方法中使用:,以便您至少尝试回滚时,至少给自己一个错误/通知。
CreateMyTable.up
,ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)
并且X是最初创建表的迁移,但是两者都不起作用-在这两种方法中,AR首先检查迁移是否已经应用,如果已迁移则自动跳过。`
您可以简单地从Rails控制台中删除表。首先打开控制台
$ rails c
然后将此命令粘贴到控制台中
ActiveRecord::Migration.drop_table(:table_name)
替换table_name为要删除的表。
您也可以直接从终端放桌子。只需输入应用程序的根目录并运行此命令
$ rails runner "Util::Table.clobber 'table_name'"
简单而正式的方式是这样的:
rails g migration drop_tablename
现在转到您的数据库/迁移并查找包含drop_tablename作为文件名的文件,然后对其进行编辑。
def change
drop_table :table_name
end
那你需要跑
rake db:migrate
在您的控制台上。
您可以按照指南中的方式回滚迁移:
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
这样,您还可以回滚并可以用于还原任何迁移
我需要删除迁移脚本以及表本身...
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
从终端窗口运行:
$ 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
放置表/迁移
运行:-$ rails生成迁移DropTablename
exp:-$ rails产生迁移DropProducts
运行此命令:-
rails g migration drop_table_name
然后:
rake db:migrate
或者,如果您使用的是MySql数据库,则:
show databases;
show tables;
drop table_name;
rails generate migration
具有用于生成用于创建表,添加或更改列等的迁移代码的命令行选项,因此,如果它还具有删除表的选项,那就很好了,但事实并非如此。当然,编写up
零件很简单-只需调用drop_table
-但down
重新生成表的零件可能并不总是那么简单,尤其是如果所讨论的表的架构已在最初创建后通过迁移进行了更改。也许有人应该向Rails的开发人员建议添加这样的选项将是一个好主意。