2012-07-27 21 views
12

Ich versuche, eine Abfrage zu führen, um 3 Tabellen in einer Datenbank zu suchen, die MySQL durch Python verwendet. Jedes Mal, wenn ich die folgende Zeichenfolge als Abfrage ausprobiere und ausfühle, gibt es einen Fehler bei der Verkettung in der Zeichenfolge.Python: ValueError: nicht unterstütztes Format Zeichen '' '(0x27) bei Index 1

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC" 

Dies ist der Fehler, den es gibt mir:

ValueError: unsupported format character ''' (0x27) at index 1 

Wenn ich den Charakter es dann fragt entferne ich muss auch die% entfernen, die die Abfrage richtig funktioniert von tatsächlich anhält. Was kann ich tun, um dies zu beheben, da ich Python ziemlich neu bin?

Danke, Kris

+4

Verwenden Sie die integrierten Zeichenfolgen-Ersetzungstools für Ihr SQL-Tool, anstatt zu versuchen, die Abfragezeichenfolge selbst mit Standard-Python-String-Mechanismen zu erstellen. Es funktioniert besser so. Verwenden Sie MySQLdb? –

+1

Ja, ich verwende MySQLdb, und wo finde ich diese Substitutionstools? – user1558746

+2

Die Dokumente unter http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes sagen: "Beachten Sie, dass alle wörtlichen Prozentzeichen in der Abfragezeichenfolge, die an execute() übergeben werden, maskiert sein müssen, dh %% . " Verwenden Sie 'execute()'? Die erwähnten Substitutionstools @Silas werden unter http://mysql-python.sourceforge.net/MySQLdb.html#some-examples angezeigt. – LarsH

Antwort

34

Es sieht aus wie Python das% als printf-ähnlichen Format Zeichen interpretiert. Probieren Sie %%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search) 
+0

Vielen Dank, das war's! :) – user1558746

+3

Um genau zu sein, verwendet MySQLdb den Operator **% **, um Parameter in die Abfrage einzufügen, daher wird jedes einzelne **% ** - Zeichen in der Abfragezeichenfolge als Beginn eines Arguments für den Parameter interpretiert. Um dies zu verhindern, verwenden Sie _ %% _ für _% _ in Abfragen. Bitte beachten Sie auch die entsprechende Dokumentation: [String Formatierung] (http://docs.python.org/2/library/stdtypes.html#string-formatting) – Magentron

0

Sie so versuchen:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search) 
+0

Können Sie erklären, warum dies die Frage beantwortet? – IanS

0

Meine Lösung:

query = """SELECT id, name FROM provice WHERE name LIKE %s""" 
cursor.execute(query, '%%%s%%' % name) 

Ich denke, es ist einfacher Weg ist, dieses Problem zu beheben!

+0

Ehm, wissen Sie, dass der '%%% s %% '% name' Teil völlig unnötig ist? ... Der Parameter der Abfrage ist der'% s', der durch den ORM oder was auch immer DB Abstraktion Sie sind ersetzt werden mit ... – AuHau

Verwandte Themen