2011-10-04 107 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