【发布时间】:2022-01-23 16:53:42
【问题描述】:
我在 Python 中使用 SQLAlchemy 作为 ORM 和底层 Sybase DB。我想限制将从 Python 编写的浮点数中的小数位数(比例)。 Sybase 表中的基础列也是 FLOAT 类型。所以即使输入浮点数是0.12345678,我也希望能够只将0.1234 写入表中。我无法更改 Sybase 模式以使用具有已定义精度和比例的 DECIMAL,它必须保持 FLOAT。这只能在 ORM 级别处理。
到目前为止,我已经尝试对 FLOAT 列进行如下建模,但它们似乎都不起作用;即,如果我尝试使用session.add({'my_floats': 0.12345678}) 写入表,它会以0.12345678 而不是0.1234 或0.1235 的形式保存到数据库中。
# mapping Sybase my_floats to NUMERIC in ORM
my_floats = Column(sqlalchemy.dialects.sybase.NUMERIC(precision=32, scale=4))
# using SQLAlchemy's internal coercion from FLOAT to DECIMAL
my_floats = Column(sqlalchemy.dialects.sybase.FLOAT(precision=32, scale=4, asdecimal=True, decimal_return_scale=4))
【问题讨论】:
-
float数据类型以机器/cpu 依赖格式存储;虽然 一些 您的插入可能会完全按照您插入它们的方式存储,但这不能保证float数据类型的行为;如果您无法更改列的数据类型(例如,更改为numeric(x,y)或decimal(x,y)),或者可能添加一个新的numeric(x,y)/decimal(x,y)列,那么您将“卡住”当前的行为......最好的你可以做的是希望你能写一个select,将float值重新格式化为你最初尝试插入的格式
标签: python sqlalchemy floating-point