ruby-on-rails - 将多个迁移文件合并为一个迁移文件
问题描述
我在本地环境中有 4 个迁移文件。我已经在开发服务器上部署了这个应用程序(所以 4 迁移已经影响了开发服务器数据库)。我还没有在生产服务器中部署这些迁移。
所有 4 个迁移都是相关的,我想将它们合并到一个迁移文件中。
这是我的方法。
- 手动删除最后 3 个迁移文件并将其内容复制到第一个文件中。
- 在开发服务器上再次部署应用程序
我的疑惑:
- 手动删除文件就够了吗?
- 此外,迁移已经在开发服务器上运行,所以开发服务器会重新运行第一个迁移文件还是真的需要这样做?
这是迁移文件(如果需要):
change_column :slots, :notes, :text
add_column :slots, :notestext, :text
Slot.update_all('notestext=notes')
remove_column :slots, :notes
rename_column :slots, :notestext, :notes
解决方案
保留四个迁移文件应该没有问题,如果您想将迁移文件合并为一个,那么首先rollback
迁移将从数据库中删除所有数据,然后按照您的方法将所有内容复制到一个文件并重新运行迁移。
运行rollback
是必要的,因为 Rails 永远不会运行它已经运行的迁移,Rails 使用schema_migrations
数据库中的表来跟踪它,它存储它已经运行的迁移版本。此外,schema.rb 文件具有它已运行的最新版本的迁移。rollback
因此,让您已经运行的迁移保持同步,并在更改后重新运行它们。
此外,如果您创建一个结合所有四个的新迁移,那么它将在数据库上出现异常,因为表已经存在。如果你在旧迁移中复制所有四个,那么你的schema_migrations
表将有一些版本号,它没有与之关联的文件,运行rake db:migrate:status
将给出如下输出:
up 20191117112500 ********** NO FILE **********
up 20191117112930 ********** NO FILE **********
所以最好回滚并重新运行迁移,这将使所有东西保持同步。要回滚四个迁移,您可以这样做:
rails db:rollback STEP=4
或者您也可以像这样检查迁移的当前状态并一一回滚:
rails db:migration:status
rails db:migration:down VERSION=<version_number>
您还可以运行该rails db:rollback
命令四次来完成这项工作。
注意:这将删除您在数据库中的所有现有数据
推荐阅读
- codeigniter - 当我选择服务器日期和时间时,它给了我错误的时间
- android-studio - 删除后如何更新ListView
- javascript - 用内部滚动反应原生 tabview 滚动标签栏
- android - Android 布局组元素
- django - 使用 Django 工作簿和工作表创建 Excel 文件
- javascript - 我可以在 HTML 页面中使用 ajax 函数调用发送参数吗?
- c - 使用 OpenSSL 发送数据
- css - 禁用聚合物中的所有 css 动画
- webpack - 如何使用 webpack 将我的模块用作我的项目中的外部库?
- c - 如何将自定义消息添加到 strerror?