Rails 5 - PostgreSQL移除已删除列和索引的迁移

4
我已经销毁了一个名为“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, 但是出现错误:找不到使用提供的选项创建的位置索引。


你是如何移除位置信息的?使用另一个迁移吗? - Ana María Martínez Gómez
4
为什么不直接删除AddSlugToLocations迁移文件? - spickermann
@spickermann,好的,这听起来很简单,但我认为如果没有完全回滚就删除AddSlugToLocations文件,将会破坏应用程序。 - Charlie
Rails d migration AddSlugToLocations locations:string,尝试这个。 - Prasanth_Rubyist
2
据我所知,整个“locations”表在生产环境中并不存在,因此索引也不存在。当您删除仅修改(不存在的)表的迁移时,它如何会破坏应用程序呢? - spickermann
显示剩余5条评论
4个回答

5
你手动从应用程序的数据库中删除了一个表。现在运行迁移会引发错误,因为其中一个迁移正在尝试修改不再存在的表。
只需从你的代码库中删除失败的迁移并重新部署你的应用程序即可。
从你的问题中,我假设编号为20180412191332的迁移导致了这个问题。在db/migrate/20180412191332_...rb中找到该迁移文件,删除它并重新部署到Heroku。

4
如果您在删除模式迁移时遇到问题,可以尝试在SQL控制台中执行以下操作:
USE mytable/dev;
DELETE FROM schema_migrations WHERE version = '20180412191332';

我在控制台中尝试了上面的代码:DELETE FROM schema_migrations WHERE version = '20180412191332'; ,但什么也没有发生...光标在下一行闪烁,等待进一步输入。 - Charlie

3

如@spickermann所指出的,只需删除迁移文件

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

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

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


1

Scaffold在生成迁移文件之外还会生成其他文件。但本注释仅关注迁移部分。

已经迁移的迁移文件具有以下内容:

  1. db/migrate/<migrationfile>.rb
  2. 更新的db/schema.rb
  3. 新表/删除的表/表中的变更
  4. schema_migrations中的新记录

因此,要成功回滚,您需要撤消这4个部分。我们可以看到这些变更存在于两个地方:源代码和数据库。

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

我将检查:

  • schema.rb不包含您不想要的内容
  • heroku rails db:migrate:status
  • 如果需要,通过rake任务进行回滚
  • 如果rake任务出现任何错误,请尝试使用psql删除schema_migrations的版本

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接