update tutorial remove query example delete python flask sqlalchemy flask-sqlalchemy

python - tutorial - Flask-SQLAlchemy comprueba si existe una fila en la tabla



sqlalchemy flask oracle (4)

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

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 verificar que la fila existe?

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.


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


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.


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.