繁体   English   中英

处理 heroku 上不存在的表的 drop_table 迁移

Deal with a drop_table migration for nonexistent table on heroku

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在本地环境中的 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迁移之前手动创建带有21041211003219_drop_campaigns_table的新迁移,但随后我觉得我将保留本地 postgres 数据库中存在的表(因为21041211003219_drop_campaigns_table已经在本地运行)。

我是否继续手动创建,然后尝试重新运行删除迁移?

有人可以就这里的最佳行动方案向我提出建议吗?

5 个回复

您可以通过将if_exists: true添加到drop_table来关闭错误PG::UndefinedTable: ERROR: table "campaigns" does not exist删除已经不存在的表时:

def up
  drop_table(:campaigns, if_exists: true)
end

这个选项的文档很少,但自 2015 年初以来就存在于 Rails 中,我认为它比手动编写 SQL 更干净,因为它还处理与各种数据库适配器的兼容性。

只需删除有问题的迁移,然后继续做更​​有趣的事情。 显然,该表没有“创建表”迁移,因此“删除表”迁移无权存在。 如果你真的不想删除迁移,你可以使用原始 SQL 重写它:

def up
  connection.execute 'drop table if exists campaigns'
end

if exists完全符合您的想法:它仅在表存在时才尝试删除该表。

关于这个东西:

我认为您不应该删除迁移,以便将来在该项目上工作的任何其他人都可以运行它们并拥有准确的数据库。

迁移旨在将应用程序的现有实例从状态 A 获取到状态 B。 如果您正在启动一个新实例,您将使用schema.rb (或structure.sql )来初始化应用程序,并且不需要迁移。 此外,一旦迁移已应用于应用程序的每个实例,除非您想尝试倒退,否则真的不再需要迁移。 我倾向于在发布几周后清除旧的迁移,以保持混乱。

if_exists不适用于 rails 4.2 和 PG 9.6。 感谢@MartinSommer 提到table_exists? . 对于后代,这是我使用的语法,读起来更清晰。

drop_table :campaigns if table_exists?(:campaigns)

当您删除迁移文件并希望删除相应的表时,例如student_items ,有两种方法:

  1. 简单的方法:将迁移文件恢复归档并运行

    rails db:rollback
  2. 创建迁移:

     rails g migration DropStudentItemTable

    并在迁移文件中添加此代码:

     class DropStudentItemTables < ActiveRecord::Migration[6.0] def down table_exists?(:student_items) ? drop_table(:student_items) : nil end end

普通 SQL

  def down
    execute <<~SQL
      DROP TABLE IF EXISTS campaigns;
    SQL
  end
1 drop_table迁移无法删除表

我读了很多关于它的内容,但仍然无法摆脱数据库中的一个表: 我没有创建此表的迁移。 但是我认为该表来自acts_as_votable gem的先前安装。 但是我可能已经手动删除了此迁移... 我尝试了drop_table,如下所示,但它不起作用。 即使我有此迁移文件,投票表仍然 ...

2 drop_table迁移不起作用

我在删除我在迁移中创建的表时遇到问题。 执行rake db:migration VERSION=0似乎是成功的,但是在mysql中,该表仍然存在,并且schema.rb数据未删除。 错字编辑:主题-&gt;主题 仅当我使用def down时才会发生这种情况。 def cha ...

4 Rails-Rails破坏了脚手架和drop_table迁移后,表仍在schema.rb中

我正在尝试删除旧模型等,这些模型是通过脚手架过去的几次迁移而创建的。 因此,我遵循了该线程中的建议,并运行了drop_table迁移和rails d scaffold Modelname命令(也许我先这样做了,现在还不确定)。 据我所知,删除了表格和由脚手架创建的所有其他文件,但是我的问 ...

5 Sequelize Migration:关系不存在

我正在完成 Author hasMany Books 示例并尝试运行 sequelize-cli 迁移,但是在运行以下迁移时遇到以下问题: 这是创建作者的第一次迁移: 创建书籍的第二次迁移: 创建 Author 和 Book 关系的迁移: 这些是我的模型: 作者.js: bo ...

6 Drop_table问题阻止rake db:migrate

我一直在寻找一种在Rails中删除表并重新开始的方法,并遇到以下答案: Rails DB迁移-如何删除表? 但是,当我运行drop_table :examples ,出现以下错误: 这是我的create_examples迁移文件: 谁能帮助我解决这个问题,并让我了解我在做什 ...

7 Rails 5:为什么删除特定表并不像输入drop_table(users)这样的命令那么简单?

我想摆脱一些开发实验,所以我开始销毁我的模型和控制器,然后进入工作的数据库部分。 看像这样的以前的答案Rails DB迁移-如何删除表? 以及Rails 5的API指南,我已经意识到,删除特定的表并不像“ rails destroy controller users”那么简单……但是为什么呢 ...

8 部署到Heroku(表不存在错误)

我正在构建一个示例预注册页面,人们可以在该页面上启动该应用程序之前注册其电子邮件。 当我输入: 我在浏览器中收到以下错误 检查日志后,我发现了这个奇怪的错误: 这意味着什么? 我有以下迁移: 和型号: 我需要怎么做才能将其部署在Heroku上? 我不 ...

9 Heroku/Rails:PG:: 未定义表:heroku rails 迁移中不存在错误“[tablename]”

我的应用程序在生产中运行良好,但是当我转到生产并运行“heroku run rake db:migrate”时,出现以下错误: 但是,我的数据库中有一个“应用程序”表。 下降可能与我前几天下降然后重新制作应用程序脚手架有关。 我该如何解决这个问题? 因此,当我运行 run rake:db s ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM