Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum schlägt „SELECT ... WHERE ... IN ...' in MySQLdb mit parametrisierten Abfragen fehl?

Barbara Streisand
Freigeben: 2024-10-29 21:46:02
Original
678 Leute haben es durchsucht

Why Does

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

Ausführen einer SQL-Abfrage mit der IN-Klausel mit MySQLdb kann eine Herausforderung darstellen, insbesondere wenn SQL-Parameter verwendet werden. Während eine ähnliche Abfrage über die MySQL-Befehlszeile möglicherweise korrekt funktioniert, kann ihre Ausführung in Python auf Schwierigkeiten stoßen.

Fallstudie

Betrachten Sie die folgende SQL-Abfrage:

SELECT fooid FROM foo WHERE bar IN ('A', 'C')
Nach dem Login kopieren

Beim Versuch, diese Abfrage in Python mit dem Befehl mysql auszuführen, wird das folgende SQL generiert:

<code class="python">sql = 'SELECT fooid FROM foo WHERE bar IN %s'
args = [['A', 'C']]</code>
Nach dem Login kopieren

Bei der Ausführung gibt diese Abfrage jedoch keine Zeilen zurück, obwohl zwei erwartet werden . Interessanterweise werden durch das Vertauschen der Rollen von bar und fooid in der Python-Abfrage die erwarteten Zeilen erfolgreich abgerufen:

<code class="python">sql = 'SELECT bar FROM foo WHERE fooid IN %s'
args = [[1, 3]]</code>
Nach dem Login kopieren

Ursache

Die Diskrepanz im Verhalten ist darauf zurückzuführen von der Art und Weise, wie MySQLdb das parametrisierte Argument ['A', 'C'] in ("'''A''"', "'''''C''"'") konvertiert, während die Abfrage ausgeführt wird. Das übertriebene Zitat Markierungen machen die IN-Klausel unwirksam.

Lösung

Da MySQLdb über keine integrierte Methode zum Binden einer Liste an eine IN-Klausel verfügt, müssen die Abfrageparameter manuell erstellt werden wie folgt:

<code class="python"># Python 3
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

# Python 2
args = ['A', 'C']
sql = 'SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p = ', '.join(map(lambda x: '%s', args))
sql = sql % in_p</code>
Nach dem Login kopieren

Durch manuelles Erstellen der IN-Klausel mit der richtigen Anzahl von Platzhaltern kann die Abfrage erfolgreich ausgeführt werden und die erwarteten Zeilen zurückgeben.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!