我已经运行一个大型Rails应用程序超过2年了,逐渐地,我的ActiveRecord迁移文件夹一直在增长,现在已经有超过150个文件。
有些非常老的模型,在应用程序中已不再使用,但是仍然被迁移文件所引用。我在考虑将它们删除。
你认为呢?你通常会从代码库中清除旧的迁移文件吗?
我已经运行一个大型Rails应用程序超过2年了,逐渐地,我的ActiveRecord迁移文件夹一直在增长,现在已经有超过150个文件。
有些非常老的模型,在应用程序中已不再使用,但是仍然被迁移文件所引用。我在考虑将它们删除。
你认为呢?你通常会从代码库中清除旧的迁移文件吗?
The Rails 4 Way 第177页: Sebastian说...
一个鲜为人知的事实是,您可以删除旧的迁移文件(同时保留较新的)以保持
db/migrate
文件夹的可管理性。您可以将旧的迁移移动到db/archived_migrations
文件夹或类似的位置。一旦裁剪了您的迁移文件夹的大小,使用rake db:reset
任务从db/schema.rb
创建(重新创建)数据库,并将种子加载到当前环境中。
一旦我发布了一个重大的网站更新,我将把迁移合并为一个,并重新开始。当迁移版本号接近75时,我会感到不舒服。
schema.rb
。 - Nathan Longschema.rb
应该是您数据库的权威来源。您可以运行 rake db:schema:load
获取最新的架构,然后运行 rake db:migrate
获取最新的迁移。 - lobati个人而言,我喜欢在迁移文件中保持整洁。我认为一旦您将所有更改推送到生产环境后,您应该考虑归档迁移。唯一困难的是当 Travis 运行时它会运行 db:migrate
,所以这些是我使用的步骤:
将历史迁移从 /db/migrate/
移动到 /db/archive/release-x.y/
手动创建一个新的迁移文件,并使用 /db/archive/release-x.y
目录中上一次运行迁移的版本号,并将描述更改为类似于 from_previous_version
的内容。使用旧版本号意味着它不会在生产机器上运行并出现问题。
将 ActiveRecord::Schema.define(version: 20141010044951) do
部分内的 schema.rb
内容复制并粘贴到 from_previous_version
变更日志的 change
方法中
全部检查完毕,Robert 就成了你父亲的兄弟。
唯一需要考虑的其他问题是您的迁移是否会创建任何数据(我的测试方案包含所有自己的数据,因此我没有这个问题)
我偶尔会清除所有已在生产中应用的迁移,对此我有至少 2 个原因:
它们相对较小,所以我会选择保留它们,仅作为记录。
在编写迁移时,不要引用模型或应用程序的其他部分,因为它们将回来困扰你 ;)
请查阅以下指南:
http://guides.rubyonrails.org/migrations.html#using-models-in-your-migrations
t.recoverable
这样的东西,如果没有这个gem就不存在,所以我根本无法运行那个迁移。至少我得把它注释掉。 - Nathan Longrake db:migrate
重新生成structure.sql/schema.rb。第二个步骤是必要的,以保持schema/structure的准确性,这也是实际上唯一重要的事情。
rake db:schema:load
来加载最新的模式,并使用 rake db:seed
填充种子数据。 rake db:reset
会为您完成这两个操作。如果你有不能转储到 schema.rb
的数据库扩展,那么你可以使用 ActiveRecord 的 SQL 模式格式 并运行 rake db:structure:load
。是的。我猜如果你已经完全从数据库中删除了任何模型和相关表,那么把它放在迁移中是值得的。如果迁移中的模型引用不依赖于任何其他东西,那么你可以删除它。虽然该迁移永远不会再次运行,因为它已经运行过了,即使你不从现有迁移中删除它,每当你重新迁移数据库时,它都会导致问题。
所以最好从迁移中删除该引用。并在大版本发布到生产数据库之前将迁移重构/最小化为一个或两个文件。
我同意,100多个迁移没有任何价值,历史记录一团糟,很难在单个表上跟踪历史记录,还会使文件查找变得混乱。在我看来,这只是浪费。
以下是将所有迁移压缩为与生产环境相同模式的三步指南:
第一步:从生产环境获取模式
# launch rails console in production
stream = StringIO.new
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream); nil
stream.rewind
puts stream.read
这段内容与迁移相关,可以复制粘贴到迁移中,但需要去掉明显的标题。
第二步:在不运行生产环境的情况下进行迁移
这一点非常重要。使用最后一个迁移并更改其名称和内容。ActiveRecord将日期时间数字存储在其schema_migrations表中,以便知道它已经运行了什么而没有运行什么。重用上一个迁移,它会认为它已经运行过了。
例如:rename 20161202212203_this_is_the_last_migration -> 20161202212203_schema_of_20161203.rb
然后把模式放在那里。
第三步:验证和故障排除
在本地,运行rake db:drop、rake db:create、rake db:migrate
验证模式是否相同。我们遇到的一个问题是模式中的datetime "now()",以下是我能找到的最佳解决方案:https://dev59.com/_10Z5IYBdhLWcg3w3DQW#40840867