Python 如果Django模型中的小数位数发生变化,现有数据会发生什么变化?

Python 如果Django模型中的小数位数发生变化,现有数据会发生什么变化?,python,django,postgresql,schema-migration,Python,Django,Postgresql,Schema Migration,我需要将DecimalField从decimal\u places=0更改为decimal\u places=7,同时保持max\u digits=50。我认为本栏中的所有数字都在0到100000000之间。因此,数据迁移可能没有问题。然而,我不确定 我看过文件,我想我找到了。然而,我需要一个介绍。是否可以查看生成的SQL查询 我可以想象出几个问题: 数据删除如果十进制(小数点=0)与十进制(小数点=7)不同,Django/Postgres不会考虑 如果内部表示保持不变,但值的解释方式不同,则

我需要将
DecimalField
decimal\u places=0
更改为
decimal\u places=7
,同时保持
max\u digits=50
。我认为本栏中的所有数字都在0到100000000之间。因此,数据迁移可能没有问题。然而,我不确定

我看过文件,我想我找到了。然而,我需要一个介绍。是否可以查看生成的SQL查询

我可以想象出几个问题:

  • 数据删除如果
    十进制(小数点=0)
    十进制(小数点=7)
    不同,Django/Postgres不会考虑
  • 如果内部表示保持不变,但值的解释方式不同,则数据会发生变化
  • 溢出如果值超出范围
  • NaN/NULL如果值超出范围
最后两种情况不应该发生在我的具体情况中,但我仍然对Django迁移如何处理越界情况感兴趣

是否可以查看生成的SQL查询

是,可以看到生成的SQL查询。您可以使用管理命令来完成此操作(
app\u label
是您的应用程序的名称,
migration\u name
是迁移的名称,例如
0001
0002
,等等):

关于您的问题,根据PostgeSQL文档,这是否会出错:

如果小数点左侧的位数超过 声明的精度减去声明的标度,将产生错误

也可从PostgreSQL文档中获得:

只有当列中的每个现有条目都可以 通过隐式强制转换转换为新类型。如果是更复杂的 如果需要转换,可以添加一个USING子句,指定如何 根据旧值计算新值

因此,如果您的迁移不可能,它将导致一个错误

python manage.py sqlmigrate <app_label> <migration_name>
BEGIN;
--
-- Alter field field_name on model_name
--
ALTER TABLE "table_name" ALTER COLUMN "field_name" TYPE numeric(50, 7);
COMMIT;