一起运行迁移和种子设定时出错



我一直在运行

rake db:drop db:create db:migrate db:seed

在开发中。 这一直工作正常...直到今天。 我的团队中的许多人通过特定的应用程序看到了这一点。 现在我们在播种数据库时出现错误。 上次迁移重命名列(此迁移已实施两个月)。 当触发seed步骤时,rake 任务崩溃(种子数据已更改为使用下一列名称)。

这工作正常

rake db:drop db:create db:migrate
rake db:seed

我已经回去检查了我master中的旧提交,它们也中断了。 奇怪的是,这才刚刚开始发生在已知有效的代码上。

轨道 5.0.2, 红宝石 2.3.4, 耙 12.0.0

我追踪到了它。 事实证明,早期的迁移有一些代码与User类通信并执行了一些数据转换。 通过在迁移中引用User,Rails加载了模型的属性定义。 然后又进行了一次迁移并更改了列名称。 当我们稍后在种子文件中使用User时,它仍然保存原始属性定义并崩溃。

这就解释了为什么单独运行rake db:seed。 Rails 有机会重新启动环境并再次读取属性定义。

我们的最终解决方案是删除旧的数据转换,因为它已经应用于 prod。 只有重建本地开发环境的开发人员才需要它(此时他们有一个空数据库,因此没有什么要转换的)。

另一种解决方案是在数据转换运行后调用User.reset_column_information。 这将清除属性定义,并为应用提供干净的工作状态,以便将来进行迁移(和种子文件)。

> Rails 6.0.3 也有同样的问题 我有向现有模型添加新列的迁移,并因此而种子崩溃。

添加

ApplicationRecord.reset_column_information

在种子的顶部.rb 解决了问题。

最新更新