我一直在跑
rake db:drop db:create db:migrate db:seed
正在开发中。这一直很好......直到今天。我的团队中的多个人通过特定的应用程序看到了这一点。现在我们在播种数据库时遇到错误。上次迁移重命名一个列(此迁移已实施两个月)。当seed
步骤触发(种子数据已更改为使用下一列名称)时,rake任务崩溃。
这很好用
rake db:drop db:create db:migrate
rake db:seed
我已经回去查看我master
中的旧提交,他们也在破坏。奇怪的是,这种情况刚刚开始发生在已知可行的代码上。
Rails 5.0.2,Ruby 2.3.4,Rake 12.0.0
答案 0 :(得分:1)
我追踪了它。事实证明,早期的迁移有一些代码与User
类进行了对话并执行了一些数据转换。通过在迁移中引用User
,Rails加载了模型的属性定义。然后又出现了另一个迁移并更改了列名。当我们稍后在种子文件中使用User
时,它仍然保持原始属性定义并崩溃。
这解释了为什么单独运行rake db:seed
。 Rails有机会重新启动环境并再次读取属性定义。
我们的最终解决方案是删除旧的数据转换,因为它已经应用于prod。只有那些正在重建本地开发环境的开发人员才需要它(当时他们有一个空的数据库,所以没有什么可以转换的。)
另一个解决方案是在数据转换运行后调用User.reset_column_information
。这将消除属性定义,并为应用程序提供一个干净的工作状态,以便将来的迁移(和种子文件)。