我定期需要一个脚本来清理或调整 Rails 应用程序中的部分数据库。这通常是迁移或准备迁移的结果。
例如,最近我向表中添加了一个显式rank
列以启用显式排序而不是按字母顺序排序。添加排名列后,我需要为现有数据填充它。这需要一个脚本来加载现有数据、确定排名并将它们保存到数据库中。有很多例子需要这样的脚本。
问题是,如何处理这些脚本,以便顺利部署到生产环境。我通常将它们编写为迁移,但我经常遇到迁移中的代码在编写时运行良好的问题,但是当它稍后作为部署的一部分运行时,由于各种原因它会中断。最近一次是由于 before_save 回调引用了在运行迁移时尚未添加的列,因为它是较旧的迁移。
似乎可能有几种策略:
策略 1:分阶段部署。因此,如果有两个提交 A 和 B 包含在部署进一步提交之前需要运行的迁移,您将部署到 A,然后运行迁移,然后部署到 B,然后再次运行迁移,最后部署所有通往 HEAD 的道路。
策略 2:不要在迁移中使用任何 AR 代码,一切都使用 SQL。但有时 AR 实在是太有用了。
策略3:其他一些我不知道的技巧。
人们做什么?在这种情况下,最佳做法是什么?