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)
不同,Django/Postgres不会考虑十进制(小数点=7)
- 如果内部表示保持不变,但值的解释方式不同,则数据会发生变化
- 溢出如果值超出范围
- NaN/NULL如果值超出范围
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;