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.

3voto

Moh-Spark Punkte 67

Oder vielleicht .in_(list) verwenden, ähnlich wie @Carl bereits vorgeschlagen hat als

 stmt = select(
        id,
         name
      ).where(
        id.in_(idlist),
      )

Vollständiger Code unter der Annahme, dass Sie das Datenmodell in der Klasse User haben:

def fetch_name_ids(engine, idlist):
    # create an empty dataframe
    df = pd.DataFrame()
    try:
        # create session with engine
        session = Session(engine, future=True)
         stmt = select(
            User.id,
            User.name
          ).where(
            User.id.in_(idlist),
          )
        data = session.execute(stmt)

        df = pd.DataFrame(data.all())
        if len(df) > 0:
            df.columns = data.keys()
        else:
            columns = data.keys()
            df = pd.DataFrame(columns=columns)

    except SQLAlchemyError as e:
        error = str(e.__dict__['orig'])
        session.rollback()
        raise error
     else:

        session.commit()
     finally:

        engine.dispose()
        session.close()

      return df

2voto

Sathia Punkte 6348

In dieser Frage wurde eine Lösung für die Select-Abfrage gepostet, leider funktioniert sie nicht für die Update-Abfrage. Mit dieser Art und Weise, auch es würde helfen, Bedingungen auch auswählen.

Abfrage aktualisieren Lösung:

id_list = [1, 2, 3, 4, 5] # in most cases we have an integer list or set
query = 'update myTable set content = 1 WHERE id IN {id_list}'.format(id_list=tuple(id_list))
conn.execute(query)

Nota : Verwenden Sie eine Tupel anstelle einer Liste.

-1voto

Majid Punkte 2759

Nur eine Ergänzung zu den obigen Antworten.

Wenn Sie ein SQL mit einer "IN"-Anweisung ausführen möchten, können Sie dies tun:

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)

Zwei Punkte:

  • Für die IN-Anweisung (z. B. "... IN(%s)") sind keine Klammern erforderlich, es genügt "...IN %s".
  • Erzwingt, dass die Liste Ihrer IDs ein Element eines Tupels ist. Vergessen Sie nicht das " , " : (ids_list,)

EDIT Achten Sie darauf, dass dies zu einem Fehler führt, wenn die Länge der Liste eins oder null ist!

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