ruby-on-rails - 处理 heroku 上不存在的表的 drop_table 迁移

标签 ruby-on-rails postgresql activerecord rails-activerecord

我在本地环境的 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 existdrop_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/

相关文章:

mysql - SIGTERM + Rails + mysql?

ruby-on-rails - PostgreSQL on Rails 3.2 不支持 sslmode

PostgreSQL - 是否可以并行化更新?

sql - 在 Postgres : What is the most concise way to use `IS DISTINCT FROM` on multiple values?

ruby-on-rails - Rails 验证虚拟属性

ruby-on-rails - 在 PGSQL ActiveRecord 中构建与自定义字符串外键的一对多关系

ruby-on-rails - Skip_callbacks - 不工作 Rails 5

ruby-on-rails - 从 ROR 模型中的另一个表获取变量

从命令行执行查询时出现 PostgreSQL 编码问题

ruby-on-rails - Ruby & Rails - 使用 CSV 中的关联播种数据