2012-03-27 3 views
1

저는 Python 언어에서 nube이고 저는 (Tkinter에서) Python GUI를 데이터베이스에 연결하는 데 어려움을 겪고 있습니다. 레이아웃은 최종 사용자가 항목 위젯을 통해 데이터베이스에 이름을 추가하도록하려는 경우와 같습니다. 나는 변수를 사용하여 데이터베이스에 저장할 텍스트를 얻기 위해 노력, 무엇인가 :Python GUI를 MySQL 데이터베이스에 연결하기

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

나는 데이터를 저장할 수있는 방법이있다 :

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

이 오류 메시지를 다시 제공 그 대신 다른 곳에서 var1 = raw_input("Name: ")을 사용할 필요없이 데이터베이스에 입력 위젯을 사용할 수 있습니까?

감사합니다. 코드가 작동하지 않은 이유 :

답변

4

(선호)

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= "UPDATE Tests SET NAME='%s' WHERE id='%s'", (var1, id) 
    cur.execute(sql_update) 

교체 : 같은 튜플 전달 함수 인자는 그것을 하나의 argumen으로 전달할 것이다. 티; ,은 튜플을 생성하지만 함수 선언/호출 내부에 없으면 인수 구분 기호가됩니다.

*sql_update을 사용하면 튜플을 위치 인수로 언팩하므로 다시 작동합니다. 그러나 코드 라인을 짧게 유지하기 위해 변수를 사용하기 때문에 SQL 문자열을 넣고 cur.execute()을 호출 할 때 튜플 인라인을 생성하면됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신의 방법을 시도했고 이번에는 오류가 없으므로 그것을 테스트하기로 결정했다 : – butteredtoast

+0

나는 단지'% s' 주위의 따옴표를 알아 차렸다. 당신은 그것들을 제거해야한다. dbapi는 속성을 적절하게 인용 (또는 데이터베이스에서 지원하는 경우 별도로 전달) 할 것이므로 직접 인용하면 문제가 발생합니다. – ThiefMaster

+0

당신의 방법을 시도하고 이번에는 오류가 없으므로 cur.execute ("SELECT * FROM Tests")를 사용하여 테스트하기로 결정했습니다. rows = cur.fetchall() 행의 행 : 인쇄 행 (3L, " '") (2L, "'") (5L, " ' 그 문제가 있습니다. 나는 그것이 고통스럽게 분명해야하지만 그것을 참조하는 방법 var1 = ent.get()이 출력을주는거야? 입력 위젯에서 텍스트를 가져 오는 다른 방법은 없습니까? 귀하의 도움을 크게 주시면 감사하겠습니다. – butteredtoast

관련 문제