Heim >Datenbank >MySQL-Tutorial >Warum schlägt die Abfrage „SELECT ... WHERE ... IN ...' in MySQLdb fehl?
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!