Flask-SQLAlchemy verifica si existe una fila en la tabla

2 minutos de lectura

avatar de usuario
pav sidhu

Tengo una aplicación Flask que usa Flask-SQLAlchemy para conectarse a una base de datos MySQL.

Me gustaría poder verificar si una fila está presente en una tabla. ¿Cómo modificaría una consulta así para comprobar que existe la fila?

db.session.query(User).filter_by(name="John Smith")

Encontré una solución a esta pregunta que usa SQLAlchemy pero no parece encajar con la forma en que funciona Flask-SQLAlchemy:

from sqlalchemy.sql import exists    
print session.query(exists().where(User.email == '...')).scalar()

Gracias.

  • ¿De qué manera la primera consulta no comprobar que la fila existe?

    – Daniel Rosemann

    04/10/2015 a las 21:17

  • Me gustaria que la consulta volviera True o False si la fila existe.

    –Pav Sidhu

    4 oct 2015 a las 21:18

avatar de usuario
davidismo

Dado que solo desea ver si el usuario existe, no desea consultar todo el objeto. Solo consulte la identificación, existe si el retorno escalar no es Ninguno.

exists = db.session.query(User.id).filter_by(name="davidism").first() is not None
SELECT user.id AS user_id 
FROM user 
WHERE user.name = ?

Si usted sabe name (o cualquier campo que esté consultando) es único, puede usar scalar en vez de first.

La segunda consulta que mostró también funciona bien, Flask-SQLAlchemy no hace nada para evitar cualquier tipo de consulta que pueda hacer SQLAlchemy. esto vuelve False o True en vez de None o una identificación como la anterior, pero es levemente más caro porque utiliza una subconsulta.

exists = db.session.query(db.exists().where(User.name == 'davidism')).scalar()
SELECT EXISTS (SELECT * 
FROM user 
WHERE user.name = ?) AS anon_1

avatar de usuario
ana

bool(User.query.filter_by(name="John Smith").first())

regresará False si los objetos con este nombre no existen y True si existiera.

  • Encontré esta respuesta útil, pero tuve que cambiarla a bool(session.query(User).filter_by(name='John Smith').first())

    – encaje de color

    21 de julio de 2020 a las 23:13

  • Está funcionando, pero no es necesario buscar todo el Usuario solo para encontrar si existe.

    -Peter Kilczuk

    24 de abril de 2021 a las 8:29

avatar de usuario
lyschoening

envolver un .exists() consulta en otro session.query() con un scalar() llamar al final. SQLAlchemy producirá un optimizado EXISTS consulta que devuelve True o False.

exists = db.session.query(
    db.session.query(User).filter_by(name="John Smith").exists()
).scalar()
SELECT EXISTS (SELECT 1 
FROM user 
WHERE user.name = ?) AS anon_1

mientras es potencialmente más caro debido a la subconsulta, es más claro lo que se está consultando. También puede ser preferible a db.exists().where(...) porque selecciona una constante en lugar de la fila completa.

avatar de usuario
móvil

Creo que hay un error tipográfico en la respuesta de davidism, esto funciona para mí:

exists = db.session.query(**User**).filter_by(name="davidism").scalar() is not None

¿Ha sido útil esta solución?