408 votes

Clause IN de SQLAlchemy

J'essaye de faire cette requête dans sqlalchemy

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

Je voudrais lier la liste [123, 456] au moment de l'exécution.

591voto

Simon Points 4162

Et si

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

modifier : Sans l'ORM, ce serait

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

select() prend deux paramètres, le premier est une liste de champs à récupérer, le second est l'adresse de l'utilisateur. where condition. Vous pouvez accéder à tous les champs d'un objet de table via la fonction c (ou columns ).

200voto

Xion Points 11130

En supposant que vous utilisez le style déclaratif (c'est-à-dire les classes ORM), c'est assez facile :

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

db_session est votre session de base de données ici, tandis que User est la classe ORM avec __tablename__ égal à "users" .

36 votes

Utilice ~ ( ~User.id.in_([123,456]) ) ou not_ de sqlalchemy.sql.expression ( not_(User.id.in_([123,456])) ).

3 votes

61voto

Jet Yang Points 716

Une autre façon est d'utiliser le mode SQL brut avec SQLAlchemy, j'utilise SQLAlchemy 0.9.8, python 2.7, MySQL 5.X, et MySQL-Python comme connecteur, dans ce cas, un tuple est nécessaire. Mon code est listé ci-dessous :

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()

J'espère que tout fonctionnera pour vous.

7 votes

Si vous utilisez du SQL brut pour des requêtes aussi simples, il est préférable d'utiliser directement psycopg2 ou un autre connecteur.

17voto

dmitry Points 116

Je voulais juste partager ma solution en utilisant sqlalchemy et pandas en python 3. Peut-être que quelqu'un la trouvera utile.

import sqlalchemy as sa
import pandas as pd
engine = sa.create_engine("postgresql://postgres:my_password@my_host:my_port/my_db")
values = [val1,val2,val3]   
query = sa.text(""" 
                SELECT *
                FROM my_table
                WHERE col1 IN :values; 
""")
query = query.bindparams(values=tuple(values))
df = pd.read_sql(query, engine)

11voto

Carl Points 176

Avec l'API d'expression, ce qui, d'après les commentaires, est ce que cette question demande, vous pouvez utiliser la fonction in_ de la colonne concernée.

Pour demander

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

utiliser

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)

Cela suppose que user_table y conn ont été définis de manière appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X