存在可供查询的方法

如何检查查询中的数据是否存在?

例如:

users_query = User.query.filter_by(email='x@x.com')

我如何才能检查用户与该电子邮件是否存在?

我可以查一下

users_query.count()

但是如何用 存在检查呢?

87134 次浏览

据我所知,没有办法使用 orm 查询 api 来实现这一点。但是您可以降低一个级别,使用 sqllegy.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()

返回 TrueFalse

对于 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 = '...'

2021年 SqlAlchemy 1.4的答案

不要调用 .query,而是使用与 .exists直接链接的 select,如下所示:

from sqlalchemy import select


stmt = select(User).where(User.email=="x@x.com").exists()

资料来源: https://docs.sqlalchemy.org/en/14/core/selectable.html?highlight=exists#sqlalchemy.sql.expression.exists

这是可以做到的:

from sqlalchemy import select


user = session.scalars(
select(User).where(User.email=="x@x.com")
).first()


if user:
pass
else:
pass