如何检查一个查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='x@x.com')
我该如何检查是否存在使用该电子邮件的用户?
我可以使用以下方式进行检查:
users_query.count()
但如何使用 exists 进行检查呢?
如何检查一个查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='x@x.com')
我该如何检查是否存在使用该电子邮件的用户?
我可以使用以下方式进行检查:
users_query.count()
但如何使用 exists 进行检查呢?
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
。
session.query(literal(True)).filter(q.exists()).scalar()
。 - kakaAttributeError: 类型对象 'User' 没有属性 'query'
- Fusion.query
属性是 特定于 Flask-SQLAlchemy 的。您可以使用 session.query(session.query(User).filter(User.id == 1).exists()).scalar()
。 - Martijn Pieters我不知道有没有办法使用ORM查询API来实现这一点。但是你可以降低到更底层的水平,并使用sqlalchemy.sql.expression中的exists:
from sqlalchemy.sql.expression import select, exists
users_exists_select = select((exists(users_query.statement),))
print engine.execute(users_exists_select).scalar()
SqlAlchemy 1.4的答案
避免使用.query
,而是直接使用链接.exists
的select
,如下所示:
from sqlalchemy import select
stmt = select(User).where(User.email=="x@x.com").exists()
select()
中。 - Theron Luhn对于SQL Server,我需要这样做:
from sqlalchemy.sql.expression import literal
result = session.query(literal(True)).filter(
session.query(User)
.filter_by(email='...')
.exists()
).scalar()
print(result is not None)
# Resulting query:
# SELECT 1
# WHERE EXISTS (SELECT 1
# FROM User
# WHERE User.email = '...')
但是如果没有EXISTS
,那就简单多了:
result = (
session.query(literal(True))
.filter(User.email == '...')
.first()
)
print(result is not None)
# Resulting query:
# SELECT TOP 1 1
# FROM User
# WHERE User.email = '...'
session.query(cls).filter_by(**kwargs).first() is not None
也可以工作,无需导入 literal
,至少对于 MySQL 8.0。 - ATH使用新的统一API,在SQLAlchemy 1.4/2.0中最简单的方法:
from sqlalchemy import exists
session.scalar(
exists()
.where(User.email == 'x@x.com')
.select()
)
可以做到:
from sqlalchemy import select
user = session.scalars(
select(User).where(User.email=="x@x.com")
).first()
if user:
pass
else:
pass
select_from
手动设置FROM
子句:e = exists(select([1]).select_from(User).where(and_(User.email == '...', ...))).select()
- aikovenexists(…).select().alias('foo')
解决了问题(请参见 alias() 函数)。 - Jens