SQLAlchemy中的地板除法

4
在SQLAlchemy中,我想要先除以一个数字然后向下取整。例如,我正在寻找以下Python等价代码:
>>> 3.1415 // 0.1
31.0

遗憾的是,SQLAlchemy列元素似乎不支持 __floordiv__ 操作。

>>> mycol // 3
***TypeError: unsupported operand type(s) for //: 'Column' and 'int'

有没有办法解决这个问题?是否有与math.floor相当的函数?


你尝试过使用 sqlalchemy.func.round 吗? - ezdazuzena
1个回答

6
请记住,在列上执行操作实际上是创建一个将由数据库执行的表达式。在不同的数据库之间似乎没有一种标准方法可以“强制”整数除法。答案取决于数据库。PostgreSQL有div函数可执行整数除法。
from sqlalchemy import func

session.query(func.div(mycol, 3)).scalar()

另一方面,SQLite没有内置的方法来实现这一点,但是如果您不关心负值的正确性,可以将结果转换为整数(转换会截断小数部分,而flooring应始终返回小于输入的数字)。

from sqlalchemy import cast, Integer

session.query(cast(mycol / 3, Integer)).scalar()
# -3.14 returns -3, but should return -4

如果你想要一个“通用”的解决方案,你可以使用一个case语句,但这样做不太美观。
from sqlalchemy import case, cast, Integer

session.query(cast(case([(mycol < 0, mycol - 1)], else_=mycol), Integer)).scalar()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接