5

Ich habe ein Basisprogramm, das eine Datenbank abfragen soll, die Benutzerinformationen enthält. Ich versuche, die Informationen für einen bestimmten Benutzer auszuwählen und auf der Konsole auszugeben.Python MySQL Connector Datenbankabfrage mit% s schlägt fehl

Hier ist mein Code:

import mysql.connector 

funcon = mysql.connector.connect(user='root', password='pass', host='127.0.0.1', database='fundata') 
funcursor = funcon.cursor() 

query = ("SELECT * FROM funtable WHERE userName=%s") 
uName = 'user1' 

funcursor.execute(query, uName) 

for (userName) in funcursor: 
    print("{}".format(userName)) 

Ich habe das in einer Variablen gespeicherten Benutzername später, weil ich immer die Benutzername aus einem tkinter Eingabefeld planen. Wenn ich diesen Code ausführen bekomme ich folgende Fehlermeldung:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line 1 

ich versucht habe, in Anführungszeichen in der Abfrage das% s setzen, aber dann sucht es buchstäblich für ein ‚% s‘ Benutzername und gibt nichts zurück. Wie kann ich meinen Code ändern, sodass ich die Datenbank nur für diesen Benutzer abfragen kann?

Vielen Dank.

FYI: Ich benutze Python 3.3.

Antwort

14

ändern funcursor.execute(query, uName) Aufruf:

funcursor.execute(query, (uName,)) 

Das zweite Argument in execute nimmt eine Liste/Tupel von Strings, kein String. Der obige Aufruf erstellt das Tupel, bevor die Zeichenfolge an execute übergeben wird, so dass kein Fehler ausgelöst wird.

Der Grund, warum execute eine Liste/Tupel von Strings nimmt, liegt daran, dass es nicht vorher weiß, wie viele Strings es braucht, um Ihre Anfrage zu erfüllen.

+0

Vielen Dank. Das hat funktioniert. Kannst du erklären, warum das Komma notwendig ist? Ich habe es ohne Komma versucht und den gleichen Fehler bekommen. –

+1

Das liegt daran, dass 'execute' eine Liste oder ein Tupel von Werten als zweites Argument erwartet. Das Komma erzeugt vor Ort ein Tupel, das die Anforderungen der Funktion abdeckt. "execute" weiß nicht, wie viele Zeichenfolgen in der Abfrage vor dem Lesen ersetzt werden müssen, und möchte Ihre Abfrage nicht zweimal lesen. Es fragt nur nach einer Abfrage und dann nach einer Liste oder einem Tupel von Strings. Selbst wenn Sie nur eine Zeichenfolge ersetzen möchten, müssen Sie sie zuerst in eine Liste oder ein Tupel aufnehmen, bevor Sie sie übergeben. – huu

+0

OK. Danke für die Hilfe. –