【发布时间】:2011-11-30 13:31:30
【问题描述】:
如何检查查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='x@x.com')
如何检查是否存在使用该电子邮件的用户?
我可以用
来检查users_query.count()
但是如何用exists检查它?
【问题讨论】:
标签: python sqlalchemy exists
如何检查查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='x@x.com')
如何检查是否存在使用该电子邮件的用户?
我可以用
来检查users_query.count()
但是如何用exists检查它?
【问题讨论】:
标签: python sqlalchemy exists
下面的解决方案稍微简单一点:
from sqlalchemy.sql import exists
print session.query(exists().where(User.email == '...')).scalar()
【讨论】:
select_from手动设置FROM子句:e = exists(select([1]).select_from(User).where(and_(User.email == '...', ...))).select()
Every derived table must have its own alias 错误。添加exists(…).select().alias('foo') 修复它(参见alias() 函数)。
对我来说最容易接受和可读的选项是
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()
AttributeError: type object 'User' has no attribute 'query'
.query 属性特定于 Flask-SQLAlchemy。你会使用session.query(session.query(User).filter(User.id == 1).exists()).scalar()。
据我所知,使用 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
user = select(User).where(email="x@x.com").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 = '...'
【讨论】:
session.query(cls).filter_by(**kwargs).first() is not None 也可以工作,无需导入literal,至少对于 MySQL 8.0