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.
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
).
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"
.
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.
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.
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!
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