2014-11-06 20 views
2

在SQLAlchemy中,我想用一個數字除以然後取整。例如。我找了Python相當於以下SQLAlchemy的地板部門

>>> 3.1415 // 0.1 
31.0 

可悲的SQLAlchemy列元素似乎不支持__floordiv__

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

有沒有辦法來解決這個問題?有沒有相當於math.floor

+0

你試過'sqlalchemy.func.round'嗎? – ezdazuzena 2017-04-25 10:15:55

回答

5

請記住,對列執行操作實際上是創建一個將由數據庫執行的表達式。在不同的數據庫之間似乎沒有標準的方式來「強制」整數除法。

答案依賴於數據庫。 PostgreSQL具有執行整數除法的div函數。

from sqlalchemy import func 

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

SQLite的,而另一方面,有沒有內置的方式做到這一點,雖然你可以把結果爲一個整數,如果你不關心正確性負值(鑄造砍掉小數部分,而地板應始終返回一個數字比輸入少)。

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()