【发布时间】:2016-03-23 19:02:21
【问题描述】:
我的一个迁移文件正在引用另一个表/模型,它将在迁移序列的后面进一步创建。
Postgres 不喜欢这样:
PG::UndefinedTable: 错误:关系“用户”不存在
所以我想知道手动重新排序迁移文件(通过发明新的时间戳/前缀)是否存在任何潜在问题?
受影响的表已经向下迁移。
【问题讨论】:
标签: ruby-on-rails postgresql rails-migrations ruby-on-rails-5
我的一个迁移文件正在引用另一个表/模型,它将在迁移序列的后面进一步创建。
Postgres 不喜欢这样:
PG::UndefinedTable: 错误:关系“用户”不存在
所以我想知道手动重新排序迁移文件(通过发明新的时间戳/前缀)是否存在任何潜在问题?
受影响的表已经向下迁移。
【问题讨论】:
标签: ruby-on-rails postgresql rails-migrations ruby-on-rails-5
当您运行 rake db:migrate 命令时,它会比较位于 db/migrate 文件夹中的 schema_migrations 表和迁移文件。然后所有未执行的迁移都会收到MigrationClass#up 调用。
因此,从您的代码已经发布和/或迁移由其他用户运行时开始,更改您的迁移时间戳/名称可能会导致无法处理的迁移过程(因为schema_migrations 会将更改时间戳的迁移视为新迁移,未处理的一个,并尝试“再次”处理它)。可能的解决方法是评论 up 方法的内容一段时间,并在迁移完成后取消评论。为了好玩,您还可以直接从您的数据库控制台操作schema_migrations 表(添加或删除必要的记录)。不过,这两种方式都闻起来像 hack。
在那之前……一切都应该完美无缺。
【讨论】:
这对我来说同样适用于同样的情况,即使它是一个 hack。
Rails 按照时间戳的顺序运行迁移,Rails 通过迁移文件名的时间戳部分而不是文件名的其余部分来跟踪哪些迁移已经运行。因此,如果您需要更改两个迁移的顺序,因为前一个引用了后一个,您可以通过重命名两个迁移文件来简单地切换文件名的 14 位时间戳部分。如果时间戳偏离了一个数字,Rails 会认为这是一个新的迁移,所以在更改它们之前把它们写下来。
【讨论】: