ruby中如何跳过失败的migration

ruby中如何跳过失败的migration

  • 跳过失败migration的三种方法
    • 手动注释掉失败migration的change
    • 手动删除或者修改出现问题的数据库表
    • 手动调整schema_migrations的version

跳过失败migration的三种方法

ruby中我们通过RAILS_ENV=production rake db:migrate的方法执行数据库的变更,但有时在测试环境部署时,因为某些原因,会出现部署的migration未能成功执行的情况,遇到失败的migration,有什么办法跳过失败的migration呢,以下有三种方法可用。

手动注释掉失败migration的change

该方法针对失败的migration已经在数据库中有数据表的情况:

  1. log查看报错;
  2. 找到报错中展示的出现报错的migration文件;
  3. 将migration文件中,在报错中出现的change语句注释掉;
  4. 重新执行migration;
  5. migration跳过了被注释掉的已有数据表的语句,其他内容正常执行;

手动删除或者修改出现问题的数据库表

该方法针对失败的migration已经在数据库中有数据表的情况:

  1. log查看报错;
  2. 找到报错中展示的mysql或者postsql中的有问题的数据库表或者行数据;
  3. 进入mysql,找到它;
  4. 手动删除或者修改有问题的数据;
  5. 重跑miration,结果正常;

手动调整schema_migrations的version

该方法也针对失败的migration已经在数据库中有数据表的情况:

  1. log查看报错;
  2. 找到报错中展示的出现报错的migration文件;
  3. 通过rails c或者mysql直连的方式,访问数据库,并手动修改(增加或者删除报错migration文件对应的version对象数据);
  4. 语句:
INSERT INTO schema_migrations(version) VALUES ('20210324133824');
  1. 重新执行migration;
  2. migration跳过了被修改的migration.rb文件的数据库执行操作,其他内容正常执行;
  3. 这一方案的原理是,schema_migrations这个表专门记录当前数据库的 “迁移ID” 是多少, Rails就是通过比较它和 db/migrate 中文件的差异来判断, 当前的rails,的数据库,是否是最新的。

参考文章:
1、数据库迁移
2、新手问题 数据迁移的问题
3、Schema Migrations Table
4、你如何跳过失败的迁移? (rake db:migrate)
5、MySQL Schema_Migrations - Active Record - Update Values

你可能感兴趣的:(rails,mysql,mysql,ruby,on,rails,migration)