387 Stimmen

SQLAlchemy IN-Klausel

Ich versuche, diese Abfrage in Sqlalchemy durchzuführen

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

Ich möchte die Liste binden [123, 456] zur Ausführungszeit.

557voto

Simon Punkte 11090

Wie wäre es mit

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

editar : Ohne den ORM wäre es

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

select() benötigt zwei Parameter, der erste ist eine Liste der abzurufenden Felder, der zweite ist die where Zustand. Sie können auf alle Felder eines Tabellenobjekts über die c (oder columns ) Eigenschaft.

194voto

Xion Punkte 21530

Vorausgesetzt, Sie verwenden den deklarativen Stil (d.h. ORM-Klassen), ist es ziemlich einfach:

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

db_session ist hier Ihre Datenbanksitzung, während User ist die ORM-Klasse mit __tablename__ gleich "users" .

57voto

Jet Yang Punkte 834

Ein alternativer Weg ist die Verwendung von rohem SQL-Modus mit SQLAlchemy, ich verwende SQLAlchemy 0.9.8, Python 2.7, MySQL 5.X und MySQL-Python als Konnektor, in diesem Fall wird ein Tupel benötigt. Mein Code ist unten aufgeführt:

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

Ich hoffe, dass alles für Sie funktioniert.

16voto

dmitry Punkte 414

Ich wollte nur meine Lösung mit Sqlalchemy und Pandas in Python 3 teilen. Vielleicht würde man es nützlich finden.

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 Punkte 817

Mit der Ausdrucks-API, nach der in dieser Frage gefragt wird, können Sie die in_ Methode der betreffenden Spalte.

Zur Abfrage

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

verwenden.

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)

Dies setzt voraus, dass user_table y conn angemessen definiert wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X