ruby 在使用新数据库列进行蓝绿色部署期间,如何处理'ActiveModel::UnknownAttributeError'?

gzjq41n4  于 2023-03-08  发布在  Ruby
关注(0)|答案(2)|浏览(142)
上下文:

我们使用蓝绿色部署,这意味着在发布期间,具有旧代码和新代码的容器暂时共存1到10分钟,而不是几秒钟。

问题:

在发布过程中,包含了一个向现有表添加新列的迁移。这会导致在旧容器中运行的代码出错。

attributes = MyTable.find(X).attributes
MyTable.create!(attributes)
=> ActiveModel::UnknownAttributeError unknown attribute 'xxx' for MyTable
原因:

旧容器中的架构缓存不包含有关新添加列的信息。使用attributes方法时,代码从数据库而不是架构缓存中检索信息,后者包含新信息。

目标:

有没有方法可以避免ActiveModel::UnknownAttributeError,同时保持蓝绿色部署?即使添加非空列,该解决方案也应该有效。对应用程序或发布过程的更改都是可以接受的。

zbdgwd5y

zbdgwd5y1#

Rails在服务器启动时加载数据库模式及其表定义,这意味着在部署使用新添加列的代码之前需要迁移数据库。
根据您的部署设置,最安全的方法是先部署数据库迁移,然后再部署新模型。或者,您需要确保在使用新代码启动应用服务器之前运行数据库迁移。

c2e8gylq

c2e8gylq2#

在这种情况下,通常建议的做法是部署忽略要添加的列的应用版本,例如:

class MyTable < ApplicationRecord
  self.ignored_columns = [:xxx]
end

在部署应用程序以忽略此类列之后,可以运行包含迁移的部署,然后可以推送取消忽略该列(并且很可能使用该新列)的新部署。这应允许您避免遇到的问题。

相关问题