2012-03-27 10 views
1

Ich bin ein Nube in der Python-Sprache und es fällt mir schwer, meine Python-GUI (in Tkinter) mit einer Datenbank zu verknüpfen. Das Layout ist so, dass ich möchte, dass der Endbenutzer über ein Eingabe-Widget Namen zu einer Datenbank hinzufügt. Ich habe versucht, den Text zu erhalten, indem Sie eine Variable in der Datenbank zu speichern, so etwas wie:Verknüpfung von Python-GUI mit MySQL-Datenbank

entr= Entry(frame1) 
entr.grid(row=0, column=1) 

var1=entr.get() 

def save(): 
    """Save content in the entry box""" 
    con = mdb.connect(host="localhost", user="root", passwd="xxxxxx", db="xxxxxxx") 
    with con: 
     cur=con.cursor() 
     sql_update= "UPDATE Tests SET NAME='%s' WHERE id='%s'", (var1, id) 
     cur.execute(sql_update) 
     cur.close() 
     con.commit() 
     con.close() 

dies gibt die Fehlermeldung zurück:

TypeError: query() argument 1 must be string or read-only buffer, not tuple 

ist es eine Möglichkeit, Daten aus dem sparen Eintrag Widget in die Datenbank ohne var1 = raw_input("Name: ") woanders statt verwenden?

Vielen Dank für Ihre Zeit! :)

Antwort

4

ersetzen

sql_update= "UPDATE Tests SET NAME='%s' WHERE id='%s'", (var1, id) 
    cur.execute(sql_update) 

mit (bevorzugt)

sql_update= "UPDATE Tests SET NAME=%s WHERE id=%s" 
    cur.execute(sql_update, (var1, id)) 

oder

sql_update= "UPDATE Tests SET NAME=%s WHERE id=%s", (var1, id) 
    cur.execute(*sql_update) 

Wenn Sie sich fragen, warum Ihr Code nicht funktioniert: ein Tupel als Passing Ein Funktionsargument gibt es als einzelnes Argument weiter t; während , Tupel erstellt, tut es dies nur, wenn es nicht in einer Funktionsdeklaration/Aufruf - dort ist es das Argument Trennzeichen.

Mit wird das Tupel in Positionsargumente entpackt, damit es wieder funktioniert. Da Sie die Variable jedoch wahrscheinlich nur verwenden, um Ihre Codezeilen kürzer zu halten, geben Sie nur die SQL-Zeichenfolge ein und erstellen Sie das Tupel inline, wenn Sie cur.execute() aufrufen.

+0

Vielen Dank für Ihre Antwort. Ich habe Ihre Methoden ausprobiert und habe diesmal kein Fehler bekommen, also habe ich beschlossen, es zu testen: – butteredtoast

+0

Ich habe gerade die Anführungszeichen um '% s' bemerkt - Sie müssen sie entfernen. Der dbapi kümmert sich darum, Ihre Attribute richtig zu zitieren (oder sie separat weiterzuleiten, wenn sie von der Datenbank unterstützt werden). Wenn Sie sie also selbst zitieren, können Probleme auftreten. – ThiefMaster

+0

Ich habe versucht, Ihre Methoden und diesmal kein Fehler, also entschied ich mich, es zu testen mit cur.execute ("SELECT * FROM Tests") rows = cur.fetchall() für Zeile in Zeilen: Zeile drucken Die Elemente hinzugefügt zur Datenbank so aussehen (1L, "'") (2L, "'") (3L, '' ') (4L,' '') (5L, '' ') was bedeutet, dass es die Variable ist Das hat das Problem. Ich weiß, es sollte schmerzhaft offensichtlich sein, aber ist es die Art, auf die ich referenziere var1 = ent.get(), die diese Ausgabe gibt? Gibt es eine andere Möglichkeit, den Text vom Eingabe-Widget abzurufen? Ihre Hilfe wird gerne in Anspruch genommen. – butteredtoast