sqlalchemy存在用于查询

les*_*tat 55 python sqlalchemy exists

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

例如:

users_query = User.query.filter_by(email='x@x.com')
Run Code Online (Sandbox Code Playgroud)

如何检查存在该电子邮件的用户?

现在我检查一下

users_query.count()
Run Code Online (Sandbox Code Playgroud)

但要检查它是否存在.

谢谢!

Cit*_*ito 70

以下解决方案稍微简单一点:

from sqlalchemy.sql import exists

print session.query(exists().where(User.email == '...')).scalar()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会给多态类型带来错误的结果。当同时过滤父级和子级属性时,结果查询将从表的笛卡尔积(外部联接)中选择。要修复它,您应该通过`select_from`手动设置`FROM`子句:`e = exist(select([1])。select_from(User).where(and_(User.email =='...',. ..)))。select()` (2认同)

Eug*_*lev 26

对我来说,最可接受和最易读的选择是

session.query(<Exists instance>).scalar()
Run Code Online (Sandbox Code Playgroud)

喜欢

session.query(User.query.filter(User.id == 1).exists()).scalar()
Run Code Online (Sandbox Code Playgroud)

返回TrueFalse.

  • `.query` 属性*特定于 Flask-SQLAlchemy*。您可以使用“session.query(session.query(User).filter(User.id == 1).exists()).scalar()”。 (3认同)
  • 另外,请注意,某些数据库(例如SQL Server)不允许在SELECT的columns子句中存在EXISTS表达式。要基于存在的WHERE选择一个简单的布尔值,请使用sqlalchemy.literal:`session.query(literal(True))。filter(q.exists())。scalar()` (2认同)
  • 这引发以下异常:`AttributeError:类型对象'User'没有属性'query'` (2认同)

Gar*_*rwe 14

我不知道使用orm查询api来做到这一点.但是你可以降低到更低的水平并使用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()
Run Code Online (Sandbox Code Playgroud)


pck*_*ko1 14

SqlAlchemy 1.4 2021 年答案

避免调用.query,而是使用select直接链接,.exists如下所示:

from sqlalchemy import select

stmt = select(User).where(User.email=="x@x.com").exists()
Run Code Online (Sandbox Code Playgroud)

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

  • 这是 SqlAlchemy 1.4 (2认同)