SQLAlchemy查询SQL Server numeric(10,2)字段值放大100倍问题
问题成因
该问题和SQLAlchemy层映射选Float还是Numeric类型无关,核心是连接SQL Server的pyodbc驱动层解析numeric类型存在配置问题或版本bug:
当pyodbc未开启正确的decimal转换配置、或版本过低时,会忽略numeric字段定义的小数位(scale)参数,将定点存储的数值按纯整数返回——你的字段定义为numeric(10,2),小数位为2,库中存储的25.00就会被驱动错误解析为25*10²=2500,上层ORM不管做什么类型转换,都只会调整返回值的Python类型,不会修正已经错了的原始数值,因此会出现无论映射成Float还是Numeric都返回2500的现象。
解决方案
按以下顺序操作即可修复:
- 先升级pyodbc到最新稳定版,旧版本存在的numeric解析bug已经在后续版本修复,执行升级命令:
pip install --upgrade pyodbc - 修改SQLAlchemy的数据库连接串,追加驱动级的numeric转换配置参数,强制驱动按字段定义的精度、小数位正确解析数值。以ODBC Driver 18 for SQL Server为例,连接串参考写法:
SQLALCHEMY_DATABASE_URI = "mssql+pyodbc://<用户名>:<密码>@<数据库服务器地址>/<库名>?driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes&numeric_decimal_conversion=yes"
核心配置项为numeric_decimal_conversion=yes,该参数会关闭驱动的整数式numeric解析逻辑。
- 修正模型层的字段映射,不要用Float类型(浮点数存储会有精度损失),明确指定和库表一致的精度、小数位:
percentualExecucao = db.Column(db.Numeric(precision=10, scale=2))
- 重新执行查询验证,库中存储的25.00会正确返回为
Decimal('25.00'),转浮点数时为25.0,不会再出现数值放大100倍的问题。
内容的提问来源于stack exchange,提问作者Cimei
相关产品推荐
相关产品推荐

