Ich habe es schwer, einige SQL in Python zu bekommen, um MySQLdb richtig zu durchlaufen. Es ist Pythons Zeichenfolge Formatierung, die mich tötet.Python-String-Formate mit SQL-Wildcards und LIKE
Meine SQL-Anweisung verwendet das Schlüsselwort LIKE mit Platzhaltern. Ich habe in Python verschiedene Dinge ausprobiert. Das Problem ist, sobald ich einen von ihnen zum Laufen bringe, gibt es eine Codezeile in MySQLdb, die das String-Format rülpst.
Versuch 1:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%%s%'" % (query)
Dies ist ein no go. Ich erhalte Wertfehler:
ValueError: unsupported format character ''' (0x27) at index 128
Versuch 2:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '\%%s\%'" % (query)
ich das gleiche Ergebnis von Versuch abrufen 1.
Versuch 3:
like = "LIKE '%" + str(query) + "%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
Das korrekte totalq schafft Variable, aber jetzt, wenn ich gehe, um die Abfrage auszuführen, bekomme ich Fehler von MySQLdb:
File "build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py", line 158, in execute query = query % db.literal(args) TypeError: not enough arguments for format string
Versuch 4:
like = "LIKE '\%" + str(query) + "\%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
Dies ist die gleiche Ausgabe wie Versuch 3.
Das alles wirklich seltsam scheint. Wie kann ich Platzhalter in SQL-Anweisungen mit Python verwenden?
zu echo @bernie unten: Von psycopg docs: http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters: "Nie, nie, niemals Python String-Verkettung (+) oder String-Parameter-Interpolation (%), um Variablen an eine SQL-Abfragezeichenfolge zu übergeben. Nicht einmal mit vorgehaltener Waffe. "Ein weiterer Vorteil neben SQL-Injection-Angriffen ist, dass der Treiber" Python-Objekte automatisch von und in SQL-Literale konvertieren kann: Mit dieser Funktion wird Ihr Code robuster und zuverlässiger. "Dies ist ein" naives " Ansatz für die Zusammensetzung von Abfrage-Strings, z " –