在 Heroku 发布期间删除数据库列而不引发异常
Remove a database column during Heroku release without raising exceptions
我正在尝试了解 Heroku 的发布阶段。据我所知,Heroku 将在发布阶段处理来自现有 dynos 的请求。那是对的吗?
这意味着如果我在发布阶段从数据库中删除了一个列,那么现有的测功机将服务于使用删除了该列的数据库的请求。只有当发布阶段最终完成时(如果我 运行 除了发布任务中的迁移之外还有其他事情,这可能需要一些时间),带有新代码的新 dynos 将被交换到服务请求中。
在发布阶段完成和新代码被交换到位期间,尝试访问已删除列的代码会引发异常(我使用 Python)。
这样说有道理吗,我的理解正确吗?
所以为了避免引发异常,我想最好部署两次。一次删除访问要删除的数据库列的代码,第二次删除该列。这是人们使用的策略吗?
关于发布阶段:您描述的行为是 preboot 的一部分,您必须为您的应用程序激活它。否则 Heroku 将在启动新的之前停止旧的 dynos。
关于删除列:
是的,由于路由器指向旧的测功机,而发布阶段是 运行,因此会发生错误。
此处的策略正是您所建议的,首先进行部署删除代码,然后进行第二次部署删除列。
请记住,一些数据库操作也会锁定整个 table 一段时间,其中对整个 table 的读写必须等待(DROP COLUMN 我相信也会得到一个完整的 table锁定)。另外例如,在更大的 table 上添加一个默认值的列会花费很多时间。
我正在尝试了解 Heroku 的发布阶段。据我所知,Heroku 将在发布阶段处理来自现有 dynos 的请求。那是对的吗?
这意味着如果我在发布阶段从数据库中删除了一个列,那么现有的测功机将服务于使用删除了该列的数据库的请求。只有当发布阶段最终完成时(如果我 运行 除了发布任务中的迁移之外还有其他事情,这可能需要一些时间),带有新代码的新 dynos 将被交换到服务请求中。
在发布阶段完成和新代码被交换到位期间,尝试访问已删除列的代码会引发异常(我使用 Python)。
这样说有道理吗,我的理解正确吗?
所以为了避免引发异常,我想最好部署两次。一次删除访问要删除的数据库列的代码,第二次删除该列。这是人们使用的策略吗?
关于发布阶段:您描述的行为是 preboot 的一部分,您必须为您的应用程序激活它。否则 Heroku 将在启动新的之前停止旧的 dynos。
关于删除列: 是的,由于路由器指向旧的测功机,而发布阶段是 运行,因此会发生错误。
此处的策略正是您所建议的,首先进行部署删除代码,然后进行第二次部署删除列。
请记住,一些数据库操作也会锁定整个 table 一段时间,其中对整个 table 的读写必须等待(DROP COLUMN 我相信也会得到一个完整的 table锁定)。另外例如,在更大的 table 上添加一个默认值的列会花费很多时间。