微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果在 Django 模型中更改 Decimals decimal_places,现有数据会发生什么情况?

如何解决如果在 Django 模型中更改 Decimals decimal_places,现有数据会发生什么情况?

我需要将 DecimalFielddecimal_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 子句来指定如何 从旧值计算新值。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。