在 models.py 中更改属性的数据类型后,Django 迁移不会应用于 Postgres



我有这个模型,其中price是一个整数字段。我确实运行了迁移,一切都很好。

from django.db import models
class Bill(models.Model):
price= models.IntegerField()

然后由于需求更改,我不得不将price字段设为 JSONField,它将根据与此类似的某些键存储price

price={"actual_price":100, "tax_price":20}

我在模型中进行了如下更改:

from django.db import models
class Bill(models.Model):
price= JSONField(blank=True, null=True)

我执行了迁移和迁移操作,迁移没有反映在数据库中。也没有错误。当我的代码尝试从数据库中读取时,我收到错误"列:价格不存在"。

我通过参考StackOverflow其他问题尝试了以下事情:

  1. 已删除该字段。运行迁移,应用它。移除现场工程 好。但是当我重新添加字段而不是将其视为新字段时 要添加的字段,它只是没有入。
  2. 从 migrations.py 文件夹中删除迁移,重新运行并重新应用它。

请注意:

  1. 我正在使用Postgres DB。同样的事情也适用于 SQLite DB,它是由 Django 内部提供的,但不适用于 Postgres。
  2. 丢失数据不是一个可行的选择,因为数据库数据是生产服务器的。
  3. 我尝试使用查询 ALTER 表 ADD 列通过 PostGres手动添加列,效果非常好。这是我使用的钩子,用作最后的手段。
  4. 应用更新的迁移之前,初始整数字段中的数据存在于某些记录中。奇怪的是,Django 也没有要求我设置值,以防我想覆盖数据。

我需要 Django 迁移来自动应用更改才能工作。由于此问题,仅添加新列和修改列的数据类型根本不起作用(删除列等休息操作有效(。

由于没有其他选择,也没有提供解决方案,我不得不将我的应用程序指向 PostGres 中的新数据库,然后它开始正常工作。今后的经验教训:

  1. 不要直接更新模型属性的数据类型,然后应用迁移。
  2. 首先删除字段,应用迁移,然后
  3. 创建具有相同名称和所需数据类型的字段,然后应用迁移。
  4. 在本地本身中使用用于生产的同一数据库。这样,可以避免部署到生产环境后的冲突。我使用SQLite进行本地处理,使用PostGres进行生产。从现在开始,我也将使用 PostGres for Local,以便我可以调试本地本身的问题。

最新更新