SqlAlchemy Core y consulta existente existe

He enfrentado un problema en el que tengo que encontrar si los datos existen en la tabla utilizando SqlAlchemy Core .

Creo que la mejor manera de hacer esta consulta es usar el método de exists , que detiene la búsqueda tan pronto como se encuentra el primer elemento. Por lo tanto, he creado esta versión de consulta:

 conn = self.db.connect() query = exists().where(cookie_table.c.cookie_id == cookie_id) result = conn.execute(query) 

Pero produce este error:

 StatementError: Not an executable clause (original cause: ArgumentError: Not an executable clause) 'EXISTS (SELECT * \nFROM cookie \nWHERE cookie.cookie_id = ?)' [] 

Intenté modificarlo un poco (combinándolo con seleccionar), pero fue en vano.

Entonces, eventualmente se me ocurrió otra solución, usando limit(1) , que funciona.

 conn = self.db.connect() query = select([1], cookie_table.c.cookie_id == cookie_id).limit(1) result = conn.execute(query).fetchone() return True if result is not None else False 

Tengo dos preguntas:

¿Cómo se puede lograr la tarea con el método exists ?

¿La consulta con limit tan eficiente como la que exists ?

Según la documentación , exists aplica a un objeto Select , y se proporcionan los siguientes ejemplos:

 # use on an existing select() s = select([table.c.col1]).where(table.c.col2==5) s = exists(s) # construct a select() at once exists(['*'], **select_arguments).where(criterion) # columns argument is optional, generates "EXISTS (SELECT *)" # by default. exists().where(table.c.col2==5) 

¿Qué está mal con tu código entonces?

Bueno, según tengo entendido, EXISTS no es una directiva en sí misma, por lo que intentar ejecutar exists() fracasará ya que no es una cláusula ejecutable.

Para ilustrar, puedes probar con una simple consola sqlite:

  • EXISTS(SELECT * from t); es un error
  • SELECT EXISTS(SELECT * FROM t); cede 0 o 1 como se esperaba.

¿Cómo solucionar su problema?

Envuelva su exists() en una statement ejecutable select() :

 result = conn.execute(select([exists().where(cookie_table.c.cookie_id == cookie_id)])) 

Debería funcionar como se espera:

 >>> print select([exists().where(users.c.name=='test')]) SELECT EXISTS (SELECT * FROM users WHERE users.name = :name_1) 

Ahora, ¿debería usar exists o limit ? Francamente, no tengo ni idea, y ni siquiera estoy seguro de que la respuesta no dependa de su motor de base de datos …