如何检查查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='[email protected]')
如何检查拥有该电子邮件的用户是否存在?
我可以用
检查这个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
.
据我所知,无法使用 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()
2021 SqlAlchemy 1.4 的答案
不要调用
.query
而是使用 select
直接与 .exists
链接,如下所示:
from sqlalchemy import select
stmt = select(User).where(User.email=="[email protected]").exists()
对于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 = '...'
SQLAlchemy 1.4/2.0 中最简单的方法,使用新的统一 API:
from sqlalchemy import exists
session.scalar(
exists()
.where(User.email == '[email protected]')
.select()
)
from sqlalchemy import select
user = session.scalars(
select(User).where(User.email=="[email protected]")
).first()
if user:
pass
else:
pass