如何检查查询中的数据是否存在?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