我在本地环境的 postgres 数据库中创建了一个“campaigns”表。我从未提交更改,因此从未将其推送到 heroku 上。
当我改变主意需要那个表时,我愚蠢地手动删除了迁移(我现在知道永远不要这样做)。但是,由于迁移已经运行,我创建了一个 21041211003219_drop_campaigns_table
迁移以从本地数据库中删除该表。
现在,当我在生产环境中运行 heroku run rake db:migrate
时,出现以下错误:
Migrating to DropCampaignsTable (20141211003219)
== 20141211003219 DropCampaignsTable: migrating ===============================
-- drop_table(:campaigns)
PG::UndefinedTable: ERROR: table "campaigns" does not exist
: DROP TABLE "campaigns"
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedTable: ERROR: table "campaigns" does not exist
: DROP TABLE "campaigns"/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.1.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.1.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `block in execute'
我知道它正在尝试为一个它从来不知道存在的表运行删除表迁移,但我不确定如何处理这个问题。
我尝试删除删除表迁移,将其推送到生产环境并运行它,但它仍然尝试运行该迁移。
回滚该提交后,我一直在考虑在 21041211003219_drop_campaigns_table
迁移之前手动创建一个带有日期戳的新迁移以重新创建表,但我觉得我会被留下该表存在于本地 postgres 数据库中(因为 21041211003219_drop_campaigns_table
已在本地运行)。
我是否继续手动创建然后尝试重新运行放置迁移?
有人可以建议我最好的行动方案吗?
最佳答案
您可以通过添加 if_exists: true
来关闭错误 PG::UndefinedTable: ERROR: table "campaigns"does not exist
到 drop_table
:
def up
drop_table(:campaigns, if_exists: true)
end
此选项的文档很少,但存在于 Rails 中 since early 2015而且我认为它比手动编写 SQL 更干净,因为它还处理与各种数据库适配器的兼容性。
关于ruby-on-rails - 处理 heroku 上不存在的表的 drop_table 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27950308/