2012-03-27 12 views
1

私はPython言語ではうんざりです。私はPython GUI(Tkinter)をデータベースにリンクするのに苦労しています。レイアウトは、エンドユーザーがEntryウィジェットを介してデータベースに名前を追加するようにします。私は、変数を使用して、データベースに保存したテキストを取得しようとしました、何かのように: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) 

を交換してください:としてタプルを渡します関数の引数はそれを単一の引数として渡しますt; ,はタプルを作成しますが、関数宣言/呼び出しの内部にない場合にのみ引数を区切ります。

*sql_updateを使用すると、タプルが定位置の引数に展開され、再び動作します。しかし、おそらくコードラインを短く保つために変数を使うだけなので、cur.execute()を呼び出すときにSQL文字列をそこに入れ、タプルをインラインで作成するだけです。

+0

ありがとうございます。私はあなたのメソッドを試してみましたが、今度はエラーが出ないので、テストすることにしました: – butteredtoast

+0

'%s'の引用符に気づいたばかりです - それらを削除する必要があります。 dbapiは属性を適切に引用して処理します(またはデータベースでサポートされている場合はそれらを個別に渡す)ので、それらを独自に引用すると問題が発生します。 – ThiefMaster

+0

私はあなたのメソッドを試してみましたが、今度はエラーがないので、cur.execute( "SELECT * FROM Tests")を使ってテストすることにしました。 rows = cur.fetchall() 行の行: 印刷行(3L、 "'") (4L、 "'") (5L、 "'")これは変数であることを意味しますそれには問題があります。私はそれが痛いほど明白なはずですが、私はこの出力を与えるvar1 = ent.get()を参照している方法ですか?エントリウィジェットからテキストを取得する他の方法はありますか?あなたの助けが大変ありがとうございます。 – butteredtoast

関連する問題