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.