sqlalchemy съществува за заявка

Как да проверя дали съществуват данни в заявка?

Например:

users_query = User.query.filter_by(email='[email protected]')

Как мога да проверя дали съществуват потребители с този имейл?

Мога да проверя това с

users_query.count()

но как да го проверя с съществува?


person lestat    schedule 04.10.2011    source източник


Отговори (4)


Следното решение е малко по-просто:

from sqlalchemy.sql import exists

print session.query(exists().where(User.email == '...')).scalar()
person Cito    schedule 11.11.2012
comment
Имайте предвид, че това би дало грешни резултати за полиморфни типове. Когато филтрирате както родителски, така и дъщерни атрибути, получената заявка ще избере от декартово произведение (външно съединение) на таблици. За да го коригирате, трябва ръчно да зададете клауза FROM чрез select_from: e = exists(select([1]).select_from(User).where(and_(User.email == '...', ...))).select() - person aikoven; 17.08.2016
comment
@aikoven: вашето предложение води до грешка Every derived table must have its own alias. Добавянето на exists(…).select().alias('foo') го поправи (вижте alias() функция). - person Jens; 05.01.2018

Най-приемливият и читав вариант за мен е

session.query(<Exists instance>).scalar()

като

session.query(User.query.filter(User.id == 1).exists()).scalar()

който връща True или False.

person Eugene Kovalev    schedule 31.01.2017
comment
Също така имайте предвид, че някои бази данни като SQL Server не позволяват изразът EXISTS да присъства в клаузата за колони на SELECT. За да изберете проста булева стойност въз основа на съществува като WHERE, използвайте sqlalchemy.literal: session.query(literal(True)).filter(q.exists()).scalar() - person kaka; 12.07.2017
comment
Това хвърля следното изключение: AttributeError: type object 'User' has no attribute 'query' - person Fusion; 26.09.2019
comment
Атрибутът .query е специфичен за Flask-SQLAlchemy. Вие бихте използвали session.query(session.query(User).filter(User.id == 1).exists()).scalar(). - person Martijn Pieters; 15.09.2020

Няма начин, който да знам, да направя това с помощта на API за заявка orm. Но можете да паднете до ниво по-ниско и да използвате exists от 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()
person Gary van der Merwe    schedule 04.10.2011

За 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 = '...'
person MarredCheese    schedule 03.10.2019
comment
Същото за Oracle 12c. Благодаря ви за решението - person Moritz Ringler; 31.01.2020
comment
session.query(cls).filter_by(**kwargs).first() is not None също ще работи, без да импортира literal, поне за MySQL 8.0 - person Elder Druid; 08.07.2021