问题描述
我需要将 DecimalField
从 decimal_places=0
更改为 decimal_places=7
,同时保留 max_digits=50
。我认为本栏中的所有数字都在 0 到 1,000,000 之间。因此,数据迁移可能没有问题。不过,我不确定。
我看过 AlterField
文档,我想我找到了 the source code。但是,我需要对此进行介绍。是否可以查看生成的 sql 查询?
我可以想象出有几件事情出错了:
-
数据删除,如果
Decimal(decimal_places=0)
与Decimal(decimal_places=7)
以 Django/Postgres 不考虑的方式不同 - 数据更改如果内部表示保持不变但值的解释方式不同
- 溢出如果值越界
- NaN / NULL 如果值超出范围
最后两种情况不应该在我的特定情况下发生,但我仍然对 Django 迁移如何处理越界情况感兴趣。
解决方法
是否可以看到生成的 SQL 查询?
是的,可以看到生成的 SQL 查询。您可以使用 sqlmigrate
[Django docs] 管理命令(app_label
是您的应用程序的名称,migration_name
是迁移的名称,例如 0001
、{{1} } 等):
0002
这会为我输出以下 SQL:
python manage.py sqlmigrate <app_label> <migration_name>
至于您的问题是否会出错,根据 Numeric Types: 8.1.2. Arbitrary Precision Numbers 上的 PostgeSQL 文档:
如果小数点左边的位数超过 声明的精度减去声明的比例,会引发错误。
同样来自 PostgreSQL 文档 Modifying Tables: 5.5.6. Changing a Column's Data Type:
只有当列中的每个现有条目都可以被 通过隐式强制转换转换为新类型。如果一个更复杂的 需要转换,您可以添加一个 USING 子句来指定如何 从旧值计算新值。
因此,如果您无法进行迁移,则会导致错误。