2016-05-20 9 views
1

Ich versuche, eine Abfrage auszuführen, die bestimmte Werte meiner Datenbank auflistet, die den Eingaben meines HTML-Suchformulars entsprechen. Ich möchte es um die Suche zu tun, auch wenn einige der Formulareingaben sind leer inputs.I bin mit Python 3.4 und meine Frage ist so etwas wie dieses:ValueError ("nicht unterstütztes Format Zeichen 'A' (0x41) bei Index 185")

query=("select DISTINCT val1,val2,val3,val4 from tab1,tab2 WHERE tab1.val1=tab2.val1 AND onoma LIKE '%' AND epitheto LIKE '%' AND (val4 between % AND %)") 
data =(d1, d2, d3 ,d4) 
c.execute("SET NAMES utf8") 
c.execute(query,data) 

die Fehler, die ich bekommen, ist dies:

ValueError("unsupported format character 'A' (0x41) at index 185",) 

Bitte, wenn Sie wissen, wie ich das beheben kann, würde ich es wirklich schätzen. Ich bin ein Anfänger mit Datenbanken. Vielen Dank im Voraus

+0

Verdoppeln Sie die '%' -Zeichen, um sie zu vermeiden. –

+0

Ah, nein, du meintest das Platzhalter? –

Antwort

0

Platzhalter für Parameter %s geschrieben sind, nicht %:

query = """ 
    select DISTINCT val1,val2,val3,val4 from tab1,tab2 
    WHERE tab1.val1=tab2.val1 AND onoma LIKE %s AND 
      epitheto LIKE %s AND 
      (val4 between %s AND %s) 
""" 

data = ('%{}%'.format(d1), '%{}%'.format(d2), d3 ,d4) 
c.execute(query, data) 

Beachten Sie, dass Sie sollten nicht Anführungszeichen um Platzhalter hinzufügen (die auf dem Datenbanktreiber verlassen), und für eine LIKE Abfrage , müssen Sie die Platzhalter zum Parameterwert hinzufügen. Ich benutzte str.format() hier, um % Wildcards vor und nach jedem Wert zu setzen. Eine Like-Abfrage ohne Wildcards (so % oder _) kann auch einfach = Gleichheit Tests verwenden.

+0

Ich wechsle auf die genaue Weise, wie oben gezeigt, und das ist, was ich bekam: ProgrammingError (1064, 'Sie haben einen Fehler in Ihrer SQL-Syntax; überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax entspricht "Wählen Sie DISTINCT val1, val2, val3, val4 von tab1, tab2 WHERE \ 'at line 1' an dieser Zeile c.execute (Abfrage, Daten) –

+0

@LoriKougioumtzian: Großartig, so dass der Parameter Teil jetzt funktioniert! Sie haben jetzt Ein SQL-Abfrage-Fehler. Funktioniert Ihre Abfrage in MySQLAdmin oder einem anderen Tool? –

+0

Ich teste es auf Mysql-Workbench und wenn ich das% s auf "% s" habe es keine Syntaxfehler. Es zeigt jedoch keine Datensätze Vielleicht ist meine Abfrage falsch für diese Situation? Sollte nicht in allen Tab1 und Tab2 Datensätze ergeben, da alles nach LIKE ist die Wildkatzen? –