Heim >Datenbank >MySQL-Tutorial >Warum schlägt die Abfrage „SELECT ... WHERE ... IN ...' in MySQLdb fehl?

Warum schlägt die Abfrage „SELECT ... WHERE ... IN ...' in MySQLdb fehl?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 17:32:02897Durchsuche

Why is

Ausführen von „SELECT ... WHERE ... IN ...“ mit MySQLdb

Trotz erfolgreicher Ausführung von SQL-Abfragen von Wenn Sie die MySQL-Befehlszeile verwenden, kann es bei der Ausführung von Abfragen mit der Syntax „WHERE ... IN ...“ in Python mithilfe von MySQLdb zu Problemen kommen. Lassen Sie uns das Problem untersuchen und eine Lösung finden.

In Ihrem Fall können Sie mit einer Abfrage, die die Spalte „bar“ mit einer „IN“-Klausel filtert, keine Zeilen abrufen, während eine ähnliche Abfrage, die die „ fooid“-Spalte mit „IN“ ist erfolgreich. Diese Inkonsistenz kann auf die Art und Weise zurückgeführt werden, wie MySQLdb parametrisierte Abfragen verarbeitet.

Wenn Sie ein Array von Werten als Argument für MySQLdb angeben, wird es automatisch in ein Tupel von Zeichenfolgen mit einfachen Anführungszeichen konvertiert, was zu einer falschen Syntax für führt die „IN“-Klausel. Beispielsweise konvertiert Ihr Code ['A','C'] in ("'A'", "'C'").

 args=[['A','C']] 

Um dieses Problem zu beheben, müssen Sie die SQL-Zeichenfolge manuell erstellen und Python verwenden, um die Werte in der „IN“-Klausel zu verketten:

<code class="python">args=['A', 'C']
sql='SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p=', '.join(list(map(lambda x: '%s', args)))
sql = sql % in_p
cursor.execute(sql, args)</code>

Alternativ können Sie für Python 2 den folgenden Code verwenden:

<code class="python">args=['A', 'C']
sql='SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p=', '.join(map(lambda x: '%s', args))
sql = sql % in_p
cursor.execute(sql, args)</code>

Dieser Code generiert dynamisch den SQL-String mit der richtigen Anzahl an Platzhaltern ('%s') von Iterieren Sie die Werte im Array und verbinden Sie sie mit einem Komma. Wenn Sie diese manuell erstellte Abfrage ausführen, erhalten Sie das erwartete Ergebnis, indem Sie Fooids auswählen, in denen sich die Spalte „bar“ in ('A','C') befindet.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Abfrage „SELECT ... WHERE ... IN ...' in MySQLdb fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn