SQLAlchemy EN la cláusula


Estoy tratando de hacer esta consulta en sqlalchemy

SELECT id, name FROM user WHERE id IN (123, 456)

Me gustaría enlazar la lista [123, 456] en el momento de la ejecución.

Author: Ilja Everilä, 2011-12-22

5 answers

¿Qué tal

session.query(MyUserClass).filter(MyUserClass.id.in_((123,456))).all()

Editar: Sin el ORM, sería

session.execute(
    select(
        [MyUserTable.c.id, MyUserTable.c.name], 
        MyUserTable.c.id.in_((123, 456))
    )
).fetchall()

select() toma dos parámetros, el primero es una lista de campos a recuperar, el segundo es el where condición. Puede acceder a todos los campos de un objeto table a través de la propiedad c (o columns).

 200
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-05 21:41:53

Asumiendo que usas el estilo declarativo (es decir, clases OR), es bastante fácil:

query = db_session.query(User.id, User.name).filter(User.id.in_([123,456]))
results = query.all()

db_session es su sesión de base de datos aquí, mientras que User es la clase OR con __tablename__ igual a "users".

 101
Author: Xion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-22 11:23:34

Una forma alternativa es usar el modo SQL crudo con SQLAlchemy, yo uso SQLAlchemy 0.9.8, python 2.7, MySQL 5.X, y MySQL-Python como conector, en este caso, se necesita una tupla. Mi código aparece a continuación:

id_list = [1, 2, 3, 4, 5] # in most case we have an integer list or set
s = text('SELECT id, content FROM myTable WHERE id IN :id_list')
conn = engine.connect() # get a mysql connection
rs = conn.execute(s, id_list=tuple(id_list)).fetchall()

Espero que todo funcione para ti.

 20
Author: Jet Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-08 04:33:01

Con la API de expresiones, que basada en los comentarios es lo que esta pregunta está pidiendo, puede usar el método in_ de la columna relevante.

Para consultar

SELECT id, name FROM user WHERE id in (123,456)

Use

myList = [123, 456]
select = sqlalchemy.sql.select([user_table.c.id, user_table.c.name], user_table.c.id.in_(myList))
result = conn.execute(select)
for row in result:
    process(row)

Esto supone que user_table y conn se han definido adecuadamente.

 5
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-19 19:01:16

Solo una adición a las respuestas anteriores.

Si desea ejecutar un SQL con una instrucción "IN", puede hacer lo siguiente:

ids_list = [1,2,3]
query = "SELECT id, name FROM user WHERE id IN %s" 
args = [(ids_list,)] # Don't forget the "comma", to force the tuple
conn.execute(query, args)

Dos puntos:

  • No hay necesidad de Paréntesis para la instrucción IN(like "... EN (%s)"), simplemente ponga" IN EN %s "
  • Fuerce la lista de sus ids a ser un elemento de una tupla. No olvides el",": (ids_list,)

EDITAR Tenga cuidado de que si la longitud de la lista es uno o cero, esto generará un error!

 2
Author: Majid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 20:10:07