2011-10-04 115 views
32

如何檢查查詢中的數據是否存在?sqlalchemy存在查詢

例如:

users_query = User.query.filter_by(email='[email protected]') 

如何,我可以檢查用戶與電子郵件的存在呢?

現在,我檢查了這與

users_query.count() 

,但希望存在檢查。

謝謝!

回答

12

沒有辦法,我知道要做到這一點使用ORM查詢API。但是你可以下降到一個較低的水平,並使用exists從sqlalchemy.sql.expression:

from sqlalchemy.sql.expression import select, exists 

users_exists_select = select((exists(users_query.statement),)) 
print engine.execute(users_exists_select).scalar() 
56

下面的解決方案是一個有點簡單:

from sqlalchemy.sql import exists 

print session.query(exists().where(User.email == '...')).scalar() 
+0

請注意,這會給多態類型帶來錯誤的結果。在過濾父和子屬性時,生成的查詢將從表的笛卡爾積(外連接)中進行選擇。要修復它,你應該通過'select_from'手動設置'FROM'子句: 'e = exists(select([1])。select_from(User).where(and_(User.email =='...' ,...)))。select()' – aikoven

+0

@aikoven:你的建議導致'每個派生表都必須有自己的別名'錯誤。添加'exists(...).select()。alias('foo')'修復它(參見[alias()](http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy。 sql.expression.alias)函數)。 – Jens

12

對我來說最可以接受的,可讀的選擇是

session.query(<Exists instance>).scalar() 

session.query(User.query.filter(User.id == 1).exists()).scalar() 

其返回TrueFalse

+1

另請注意,某些數據庫(如SQL Server)不允許EXISTS表達式存在於SELECT的columns子句中。要根據WHERE選擇一個簡單的布爾值,使用sqlalchemy.literal:'session.query(literal(True))。filter(q.exists())。scalar()' – kaka