在 models.py 中更改属性的数据类型后,Django 迁移未应用于 Postgres
Django migrations not getting applied on Postgres after changing the datatype of an attribute in models.py
我有这个模型,其中 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)
我执行了 makemigrations 和 migrate 操作,迁移没有反映在数据库中。也没有错误。当我的代码尝试从数据库中读取时,出现错误 "Column: price does not exist"。
我参考了Whosebug的其他问题尝试了以下事情:
- 删除了该字段。 运行 迁移,应用它。删除现场工作
美好的。但是当我重新添加字段而不是将其视为新字段时
要添加的字段,它只是没有被插入。
- 正在从 migrations.py 文件夹中删除迁移,重新 运行 并重新应用它。
请注意:
- 我正在使用 Postgres 数据库。同样的事情适用于 Django 内部提供的 SQLite 数据库,但不适用于 Postgres。
- 丢失数据不是一个可行的选择,因为数据库数据来自生产服务器。
- 我尝试使用查询 ALTER Table ADD Column 通过 PostGres 手动 添加列,效果非常好。这是我使用的钩子,作为最后的手段使用。
- 在应用更新的迁移之前,某些记录的初始整数字段中的数据存在。奇怪的是 Django 也没有要求我设置值以防我想覆盖数据。
我需要 Django 迁移来自动应用更改才能工作。由于这个问题,只有添加新列和修改列的数据类型根本不起作用(删除列等其他操作有效)。
由于没有其他选择,也没有提供解决方案,我不得不将我的应用程序指向 PostGres 中的新数据库,然后它开始正常工作。未来的经验教训:
- 不要直接更新模型属性的数据类型然后应用迁移。
- 首先删除字段,应用迁移,然后创建具有相同名称和所需数据类型的字段,然后应用迁移。
- 使用您在本地生产中使用的相同数据库。这样可以避免部署到生产后的冲突。我曾将 SQLite 用于本地,将 PostGres 用于生产。从现在开始,我也将在本地使用 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)
我执行了 makemigrations 和 migrate 操作,迁移没有反映在数据库中。也没有错误。当我的代码尝试从数据库中读取时,出现错误 "Column: price does not exist"。
我参考了Whosebug的其他问题尝试了以下事情:
- 删除了该字段。 运行 迁移,应用它。删除现场工作 美好的。但是当我重新添加字段而不是将其视为新字段时 要添加的字段,它只是没有被插入。
- 正在从 migrations.py 文件夹中删除迁移,重新 运行 并重新应用它。
请注意:
- 我正在使用 Postgres 数据库。同样的事情适用于 Django 内部提供的 SQLite 数据库,但不适用于 Postgres。
- 丢失数据不是一个可行的选择,因为数据库数据来自生产服务器。
- 我尝试使用查询 ALTER Table ADD Column 通过 PostGres 手动 添加列,效果非常好。这是我使用的钩子,作为最后的手段使用。
- 在应用更新的迁移之前,某些记录的初始整数字段中的数据存在。奇怪的是 Django 也没有要求我设置值以防我想覆盖数据。
我需要 Django 迁移来自动应用更改才能工作。由于这个问题,只有添加新列和修改列的数据类型根本不起作用(删除列等其他操作有效)。
由于没有其他选择,也没有提供解决方案,我不得不将我的应用程序指向 PostGres 中的新数据库,然后它开始正常工作。未来的经验教训:
- 不要直接更新模型属性的数据类型然后应用迁移。
- 首先删除字段,应用迁移,然后创建具有相同名称和所需数据类型的字段,然后应用迁移。
- 使用您在本地生产中使用的相同数据库。这样可以避免部署到生产后的冲突。我曾将 SQLite 用于本地,将 PostGres 用于生产。从现在开始,我也将在本地使用 PostGres,这样我就可以在本地调试问题。