gpt4 book ai didi

python - 更改 models.py 中属性的数据类型后,Django 迁移未应用于 Postgres

转载 作者:行者123 更新时间:2023-12-01 06:45:48 25 4
gpt4 key购买 nike

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

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)

我执行了 makemigrations 和 migrate 操作,迁移没有反射(reflect)在数据库中。也没有错误。当我的代码尝试从数据库读取数据时,出现错误“列:价格不存在”。

我引用StackOverflow其他问题尝试了以下操作:

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

请注意:

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

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

最佳答案

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

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

关于python - 更改 models.py 中属性的数据类型后,Django 迁移未应用于 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59230416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com