如何檢查查詢中的數據是否存在?sqlalchemy存在查詢
例如:
users_query = User.query.filter_by(email='[email protected]')
如何,我可以檢查用戶與電子郵件的存在呢?
現在,我檢查了這與
users_query.count()
,但希望存在檢查。
謝謝!
如何檢查查詢中的數據是否存在?sqlalchemy存在查詢
例如:
users_query = User.query.filter_by(email='[email protected]')
如何,我可以檢查用戶與電子郵件的存在呢?
現在,我檢查了這與
users_query.count()
,但希望存在檢查。
謝謝!
沒有辦法,我知道要做到這一點使用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()
下面的解決方案是一個有點簡單:
from sqlalchemy.sql import exists
print session.query(exists().where(User.email == '...')).scalar()
對我來說最可以接受的,可讀的選擇是
session.query(<Exists instance>).scalar()
像
session.query(User.query.filter(User.id == 1).exists()).scalar()
其返回True
或False
。
另請注意,某些數據庫(如SQL Server)不允許EXISTS表達式存在於SELECT的columns子句中。要根據WHERE選擇一個簡單的布爾值,使用sqlalchemy.literal:'session.query(literal(True))。filter(q.exists())。scalar()' – kaka
請注意,這會給多態類型帶來錯誤的結果。在過濾父和子屬性時,生成的查詢將從表的笛卡爾積(外連接)中進行選擇。要修復它,你應該通過'select_from'手動設置'FROM'子句: 'e = exists(select([1])。select_from(User).where(and_(User.email =='...' ,...)))。select()' – aikoven
@aikoven:你的建議導致'每個派生表都必須有自己的別名'錯誤。添加'exists(...).select()。alias('foo')'修復它(參見[alias()](http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy。 sql.expression.alias)函數)。 – Jens