上下文:
我们使用蓝绿色部署,这意味着在发布期间,具有旧代码和新代码的容器暂时共存1到10分钟,而不是几秒钟。
问题:
在发布过程中,包含了一个向现有表添加新列的迁移。这会导致在旧容器中运行的代码出错。
attributes = MyTable.find(X).attributes
MyTable.create!(attributes)
=> ActiveModel::UnknownAttributeError unknown attribute 'xxx' for MyTable
原因:
旧容器中的架构缓存不包含有关新添加列的信息。使用attributes方法时,代码从数据库而不是架构缓存中检索信息,后者包含新信息。
目标:
有没有方法可以避免ActiveModel::UnknownAttributeError,同时保持蓝绿色部署?即使添加非空列,该解决方案也应该有效。对应用程序或发布过程的更改都是可以接受的。
2条答案
按热度按时间zbdgwd5y1#
Rails在服务器启动时加载数据库模式及其表定义,这意味着在部署使用新添加列的代码之前需要迁移数据库。
根据您的部署设置,最安全的方法是先部署数据库迁移,然后再部署新模型。或者,您需要确保在使用新代码启动应用服务器之前运行数据库迁移。
c2e8gylq2#
在这种情况下,通常建议的做法是部署忽略要添加的列的应用版本,例如:
在部署应用程序以忽略此类列之后,可以运行包含迁移的部署,然后可以推送取消忽略该列(并且很可能使用该新列)的新部署。这应允许您避免遇到的问题。