【发布时间】:2018-07-20 18:26:09
【问题描述】:
我有一个带有 PostgreSQL 数据库的生产 Django 部署 (Django 1.11)。我想在我的一个模型中添加一个不可为空的字段:
class MyModel(models.Model):
new_field = models.BooleanField(default=False)
为了进行部署,我需要更新服务器上的代码或先运行迁移,但由于这是一个生产部署,请求可能(并且将会)在我更新数据库和更新服务器之间发生。如果我先更新服务器,我会得到一个OperationalError no such column,所以我显然需要先更新数据库。
但是,当我首先更新数据库时,在使用新代码更新之前,服务器上发出的请求出现以下错误:
django.db.utils.IntegrityError: NOT NULL 约束失败:myapp_mymodel.new_field
从表面上看,这没有任何意义,因为该字段具有默认值。进一步深入研究,似乎默认值是由 Django 逻辑单独提供的,而不是实际存储在 SQL 级别上。如果服务器没有更新的代码,它不会将该列传递给 SQL 进行更新,SQL 将其解释为 NULL。
鉴于此,我如何将这个新的不可为空的字段部署到我的应用程序而不让我的用户收到任何错误?
【问题讨论】:
标签: django deployment django-migrations