我从GitHub克隆了一个旧项目(在生产环境中运行)到我运行macOS v11(Big Sur)的新MacBook上。我想在新功能和更新上工作,但我不断收到一些迁移错误。
据我所知,我们不应该删除任何迁移文件。那么,修复这些错误的最佳实践是什么呢?
- 我是否应该删除、编辑导致问题的迁移文件?
- 我应该删除相关的gem沿着迁移文件并安装新的吗?
- 还有其他建议吗
命令(作为root):
bin/rails db:migrate RAILS_ENV=development
输出:
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:migrate
== 20171118122416 AddTaggingsCounterCacheToTags: migrating ====================
-- add_column(:tags, :taggings_count, :integer, {:default=>0})
-> 0.0521s
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
uninitialized constant AddTaggingsCounterCacheToTags::ActsAsTaggableOn
2条答案
按热度按时间ocebsuys1#
不,您不应该删除迁移,根据RubyonRails自己的建议,当您在已经存在迁移的旧项目上创建新数据库时,最好运行
bin/rails db:schema:load
从 schema.rb 开始:
这个文件是Rails在运行
bin/rails db:schema:load
时用来定义模式的源文件。在创建新数据库时,bin/rails db:schema:load
往往比从头开始运行所有迁移更快,并且可能更不容易出错。如果旧的迁移使用外部依赖项或应用程序代码,则这些迁移可能无法正确应用。db:setup
支持db:create
、db:schema:load
和db:seed
,这在设置项目时很有用 *rqmkfv5c2#
一般情况下使用db:schema:load即可
通常最好的解决方案是运行
bin/rails db:schema:load
,正如@Mshka所说。但是为了获得一些潜在的灵感,这里有一个案例研究,其中删除了一个旧的迁移文件(这是一个禁忌),我恢复了它,这样我就可以再次运行
db:migrate
...案例分析:删除迁移恢复
在这个例子中,一个同事删除了一个旧的迁移,没有明显的原因(可能是意外),所以
db:migrate
不再在开发中的空数据库上工作。然而,在从旧提交中跟踪已删除的迁移文件之后,简单地重新添加该迁移文件会带来新的问题:迁移现在在生产中失败,因为迁移添加的列已经存在于生产中。在我的情况下,解决方案是修改旧的迁移到
这允许
db:migrate
在开发中再次在空数据库上工作(现在正确添加了该列),并且在部署到生产时迁移继续工作(Rails会发现该列已经存在于数据库中,并且不做任何更改)。因此,如果您发现以前的提交错误地损坏了旧的迁移,那么修复损坏可能是一个方便的解决方案。但用你的判断力。