【问题标题】:Rails 5 - PostgreSQL removing migration where column and index has already been destroyedRails 5 - PostgreSQL 删除列和索引已被破坏的迁移
【发布时间】:2018-09-23 14:49:10
【问题描述】:

我已经销毁了一个脚手架“Location”及其表,但我忘记在销毁“Location”表之前回滚/删除迁移的列“slug 及其索引”。如何删除 slug 和索引的迁移。

迁移的 slug 列

class AddSlugToLocations < ActiveRecord::Migration[5.1]
  def change
    add_column :locations, :slug, :string
    add_index :locations, :slug
  end
end

非常感谢您的帮助,因为这个问题,heroku 不会部署

我试过ActiveRecord::SchemaMigration.where(version=20180412191332).delete_all,但没有成功

也尝试了rake db:migrate:down VERSION=20180412191332,但出现错误:在提供选项的位置上找不到索引。

【问题讨论】:

  • 您是如何删除位置信息的?与另一次迁移?
  • @AnaMaríaMartínezGómez,我用过rake db:migrate:down VERSION=&lt;version for location&gt;,用过rail destroy scaffold Location
  • 当表已经被删除时,索引也被删除。还是我错过了什么?
  • 为什么不直接删除AddSlugToLocations迁移?
  • 据我了解整个locations 表在生产中不存在,因此索引也不存在。当您删除只更改(不存在的)表的迁移时,它如何破坏应用程序?

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 rubygems


【解决方案1】:

Scaffold 生成除了迁移之外的其他文件。但此评论侧重于迁移部分。

已迁移的迁移具有

  1. db/migrate/&lt;migrationfile&gt;.rb
  2. 更新db/schema.rb
  3. 新表/删除表/表中的更改
  4. schema_migrations 中的新记录

因此,要成功还原,您必须撤消所有 4 个。我们可以看到更改发生在两个地方 - 源代码和数据库。

Heroku 和您的本地开发环境将具有相同的代码库,但有两个独立的数据库。

我会检查

  • schema.rb 没有你不想要的东西
  • heroku rails db:migrate:status
  • 必要时通过 rake 任务回滚
  • 如果 rake 任务出现任何错误,请尝试使用 psql 删除 schema_migrations 版本

【讨论】:

    【解决方案2】:

    您从应用程序的数据库中手动删除了一个表。现在运行迁移会引发错误,因为其中一个迁移正在尝试更改不再存在的表。

    只需从您的代码库中删除失败的迁移并重新部署您的应用程序。

    根据您的问题,我认为编号为 20180412191332 的迁移会导致问题。在 db/migrate/20180412191332_...rb 中找到该迁移文件,将其删除并重新部署到 Heroku。

    【讨论】:

      【解决方案3】:

      正如@spickermann 所说,只需删除迁移

      git rm path/to/offending/migration git commit -m "removed unneeded migration"

      (假设您正在使用 commit,因为 heroku 喜欢使用 git push 进行部署...)

      如果每次都运行失败,它就不会在schema_migrations 表中,因此您不需要从那里删除它。

      【讨论】:

        【解决方案4】:

        如果您在从架构中删除迁移时遇到问题,可以尝试在 SQL 控制台中执行此操作:

        USE mytable/dev;
        DELETE FROM schema_migrations WHERE version = '20180412191332';
        

        【讨论】:

        • 我在控制台上面试过,DELETE FROM schema_migrations WHERE version = '20180412191332';什么也没发生...光标在下一行闪烁,请求进一步输入
        猜你喜欢
        • 2011-11-04
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        • 2012-09-27
        • 2017-05-19
        • 1970-01-01
        • 2013-01-26
        相关资源
        最近更新 更多