2012-03-27 147 views
1

我是一個Python語言的nube,我很難將我的Python GUI(在Tkinter中)鏈接到數據庫。佈局是這樣的,我希望最終用戶通過Entry小部件將名稱添加到數據庫。我試圖用一個變量來獲取文本保存到數據庫中,這樣的:將python GUI鏈接到MySQL數據庫

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() 

這給後面的錯誤消息:

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

有沒有什麼辦法可以挽救數據不需要在其他地方使用var1 = raw_input("Name: ")而直接使用數據庫的入口部件?

謝謝你的時間! :)

回答

4

更換

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

與(首選)

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

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

如果你想知道爲什麼你的代碼沒有工作:傳遞一個元組作爲一個函數參數將作爲一個單獨的論證來傳遞它噸;而,創建元組,它只在它不在函數聲明/調用內部時纔會這樣做 - 在那裏它是參數分隔符。

使用*sql_update將元組解包爲位置參數,以便它再次工作。但是,由於您可能只是使用變量來縮短代碼行,因此只需將SQL字符串放在那裏,並在調用cur.execute()時創建內聯元組。

+0

謝謝您的回覆。我試過你的方法,這次沒有錯誤,所以我決定測試它: – butteredtoast 2012-03-28 09:02:27

+0

我剛剛注意到'%s'周圍的引號 - 你需要刪除它們。 dbapi會照顧正確地引用你的屬性(或者如果數據庫支持,分別傳遞它們),所以引用它們會導致問題。 – ThiefMaster 2012-03-28 09:13:28

+0

這次我嘗試了你的方法並沒有錯誤,所以我決定使用cur.execute(「SELECT * FROM Tests」)對其進行測試。 rows = cur.fetchall() 對於行中的行: print row添加的項目(1L,「'」) (2L,「'」) (3L,「'」) (4L,「'」) (5L,「'」),這意味着它是變量有問題。我知道它應該是顯而易見的,但它是我引用var1 = ent.get()給出這個輸出的方式嗎?任何其他方式來獲取來自入口小部件的文本?非常感謝您的幫助。 – butteredtoast 2012-03-28 09:14:24