Django DecimalField不遵守max_digits并导致缓冲区溢出/截断

时间:2018-06-22 21:41:17

标签: sql-server django pyodbc

我正在使用Microsoft SQL Server,带有Django 2.0.1的SQL Server ODBC驱动程序13

这实际上是在我所有的十进制字段中发生的,我希望我缺少一些简单的东西。

我已经在模型中声明了

Overhead = models.DecimalField(max_digits=6, decimal_places=4, db_column='overhead')

使用它制作一个模型表单,它实际上验证位数是否太多(例如:100.0000),并且如果设置为小于声明数量的数字(例如:9.0000),则可以正确更新。匹配max_digits的任意位数都会产生截断错误:

String data, right truncation: length 14 buffer 12

如果我用声明的DecimalField重复相同的情况:

models.DecimalField(max_digits=9, decimal_places=2, db_column='subtotal')

我从数据库驱动程序(22001)中得到了相同的错误类型,并且溢出量略有不同:

String data, right truncation: length 26 buffer 24

为日志中的update语句生成的SQL可以复制/粘贴,并且在SQL Server的SQL编辑器中具有完全相同的参数,并且可以愉快地更新记录。我一直认为,当Django编译SQL和执行它的数据库驱动程序之间发生了某些事情,但是我不确定我要寻找的是什么,因此可以提供任何帮助。

1 个答案:

答案 0 :(得分:1)

按照Gord Thompson的评论,将pyodbc升级到4.0.23解决了该问题。