SQLAlchemy中的分区

MRo*_*lin 2 python sqlalchemy

在SQLAlchemy中,我想用数字除以然后向下舍入.例如,我正在寻找以下Python的等价物

>>> 3.1415 // 0.1
31.0
Run Code Online (Sandbox Code Playgroud)

可悲的是,SQLAlchemy Column Elements似乎并不支持 __floordiv__

>>> mycol // 3
***TypeError: unsupported operand type(s) for //: 'Column' and 'int'
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?有相当于math.floor

dav*_*ism 5

请记住,对列执行操作实际上是在创建一个将由数据库执行的表达式.在不同的数据库之间似乎没有标准的方法来"强制"整数除法.

答案取决于数据库.PostgreSQL具有div执行整数除法的功能.

from sqlalchemy import func

session.query(func.div(mycol, 3)).scalar()
Run Code Online (Sandbox Code Playgroud)

另一方面,SQLite没有内置的方法来执行此操作,但如果您不关心负值的正确性,则可以将结果转换为整数(从分数部分开始剁碎,而地板应始终返回一个小于输入的数字).

from sqlalchemy import cast, Integer

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

如果你想要一些"通用"解决方案,你可以使用case语句,但它很难看.

from sqlalchemy import case, cast, Integer

session.query(cast(case([(mycol < 0, mycol - 1)], else_=mycol), Integer)).scalar()
Run Code Online (Sandbox Code Playgroud)