0

我需要将 aDecimalField从必须更改decimal_places=0decimal_places=7同时保留max_digits=50. 我认为此列中的所有数字都在 0 到 1,000,000,000 之间。因此,数据迁移可能没有问题。但是,我不确定。

我看过AlterField文档,我想我找到了源代码。但是,我需要对此进行介绍。是否可以看到生成的 SQL 查询?

我可以想象有几件事会出错:

  • 如果与Django/Postgres 不处理的方式Decimal(decimal_places=0)不同,则数据删除Decimal(decimal_places=7)
  • 如果内部表示保持不变但值以不同的方式解释,则数据更改
  • 如果值超出范围,则溢出
  • 如果值超出范围,则为NaN / NULL

在我的具体情况下,最后两种情况不应该发生,但我仍然对 Django 迁移如何处理越界情况感兴趣。

4

1 回答 1

0

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

是的,可以看到生成的 SQL 查询。您可以使用sqlmigrate[Django docs]管理命令(app_label是您的应用程序migration_name的名称和迁移的名称,例如00010002等)来做到这一点:

python manage.py sqlmigrate <app_label> <migration_name>

这为我输出以下 SQL:

BEGIN;
--
-- Alter field field_name on model_name
--
ALTER TABLE "table_name" ALTER COLUMN "field_name" TYPE numeric(50, 7);
COMMIT;

至于你的问题,如果这会出错,根据 PostgeSQL docs on Numeric Types: 8.1.2。任意精度数

如果小数点左边的位数超过声明的精度减去声明的小数位数,则会引发错误。

同样来自 PostgreSQL 文档修改表:5.5.6。更改列的数据类型

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

因此,如果您无法进行迁移,则会导致错误。

于 2021-05-20T13:56:14.360 回答