【发布时间】:2015-01-14 18:49:36
【问题描述】:
我在本地环境中的 postgres 数据库中创建了一个“活动”表。我从未提交更改,因此从未将其推送到 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 已经在本地运行)。
我是否继续手动创建,然后尝试重新运行删除迁移?
有人可以告诉我这里的最佳行动方案吗?
【问题讨论】:
-
您可以从 git 重新创建迁移。为了能够摆脱该错误,您可以使用
heroku pg:psql创建一个名为活动的表。在此控制台启动后,只需执行“创建表格活动......”。在执行此操作之前,您应该进行备份。 -
为什么不直接删除该迁移?迁移并不是代码的永久组成部分,您应该不时清除它们。
-
@Octopus-Paul - +1 我没想到,下次会记住的
-
@muistooshort - 虽然我确实先尝试了这个(问题中的参考),但我确实再次尝试了这个(第一次没有正确推动)并且它确实有效。我认为您不应该删除迁移,以便将来从事该项目的其他任何人都可以运行它们并拥有准确的数据库。我假设您的意思是“清除它们”参考无用的参考,例如给我带来问题的那个。如果你想移动回答,我会接受。
标签: ruby-on-rails postgresql activerecord rails-activerecord