将python GUI链接到MySQL数据库

问题描述:

我是一个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: ")而直接使用数据库的入口部件?

谢谢你的时间! :)

更换

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