升级到 Rails 4.2.6:rake db:migrate 将列限制插入 schema.rb

upgraded to Rails 4.2.6: rake db:migrate inserting column limits into schema.rb

我发现我们的很多列在迁移中没有 limit: xxx 突然对列应用了限制,不是在数据库本身,而是在我们的 db/schema .rb 文件。当我们只是在任何环境中进行迁移时,这并不可怕。麻烦的地方是当我们设置新的数据库时——它们不再与我们在各种 prod/staging/qa 环境中拥有的相匹配。

我需要找到一种方法来避免这种情况发生。

就目前情况而言,无论何时我们添加迁移,我们最终都不得不做一个极其复杂和乏味的事情 git add -p db/schema.rb,随着时间的推移,我对我们的 db/schema.rb 文件失去了信心与任何版本的现实相匹配。

作为一个数据点,如果我 运行 rake db:migrate 没有新的迁移,db/schema.rb 得到重建并且有一个非常大的差异。

根据 Rails 4.2 Release Notes 中的注释:

The PostgreSQL and SQLite adapters no longer add a default limit of 255 characters on string columns.

并将此评论转至相关Rails Pull Request 14579

The db/schema.rb is used to exactly recreate your database. All your string columns were added before 4.2 with an implicit limit of 255. At that time it was not necessary to dump the limit to db/schema.rb because it was the default. Now that we've changed the default to no limit. We must dump these limits to recreate the database.

问题不是新的默认设置,而是旧的默认设置的反映。

要解决此问题,我建议 运行 进行迁移,该迁移会降低相关字段的限制,然后从数据库中重新创建 schema.rb。这应该会导致新的一致状态。