Flask-SQLAlchemy comprueba si existe una fila en la tabla

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 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.

Como solo desea ver si el usuario existe, no desea consultar todo el objeto. Solo consulta el ID, existe si el retorno escalar no es Ninguno.

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

La segunda consulta que mostró también funciona bien, Flask-SQLAlchemy no hace nada para evitar cualquier tipo de consulta que SQLAlchemy pueda realizar. Esto devuelve False o True lugar de None o un ID como el de arriba, pero es un poco más caro porque usa una subconsulta.

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

Envuelva una consulta .exists() en otra session.query() con una llamada scalar() al final. SQLAlchemy producirá una consulta EXISTS optimizada 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 

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

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

Devolverá “Falso” si los objetos con este nombre no existen y “Verdadero” si existe.

Perdone el secuestro pero … con las instrucciones dadas aquí, hice el siguiente validador WTForm para verificar la singularidad del campo

 class Unique(object): def __init__(self, column, session, message="Already exists."): self.column = column self.session = session self.message = message def __call__(self, form, field): if field.data == field.object_data: return # Field value equals to existing value. That's ok. model = self.column.class_ query = model.query.filter(self.column == field.data).exists() if self.session.query(query).scalar(): raise ValidationError(self.message) 

Sería usado así

 class Register(Form): email = EmailField('Email', [Unique(User.email, db.session)]) 

Sin embargo, me gustaría tener una API que no necesite una sesión de db como segundo parámetro

 class Register(Form): email = EmailField('Email', [Unique(User.email)]) 

¿Hay alguna manera de obtener sesión db del modelo? Sin sesión, parece imposible evitar cargar todo el objeto para verificar su existencia.

Creo que hay un error tipográfico en la respuesta del davidismo, esto me funciona:

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