2009-08-20 17 views
30

私は(変数付き)正しいこのPythonのMYSQLの更新ステートメントを取得しようとしている:PythonのMYSQLの更新ステートメント

cursor.execute ("UPDATE tblTableName SET Year=%s" % Year ", Month=%s" % Month ", Day=%s" % Day ", Hour=%s" % Hour ", Minute=%s" Minute "WHERE Server=%s " % ServerID) 

私が間違っているつもりです任意のアイデア?

答えて

61

それはshould be

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

あなたは基本的な文字列操作、

cursor.execute ("UPDATE tblTableName SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s WHERE Server='%s' " % (Year, Month, Day, Hour, Minute, ServerID)) 

しかしthis way is discouraged because it leaves you open for SQL Injectionでそれを行うことができます。それはとても簡単です(そして同様の)ので、正しい方法tm。それを正しくしてください。

唯一注意すべき点は、データベースのバックエンドの中には、文字列を置換するための同じ規則に従わないことがあることです(SQLiteが気に入っています)。より多くの場合

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

read the documentation

+5

パオロの答えが良いです。 http://stackoverflow.com/questions/1307378/python-mysql-update-statement/1307413#1307413 – voyager

+0

しかし、これはすべてのバックエンドで動作します。このバージョンでは入力の検証は行われませんが、Paoloの方法では変数の内容をエスケープします。 – voyager

+5

このようにはしません。あなたは自分自身をSQLインジェクション攻撃に広く開放しています。パウロは正しい答えを持っています。なぜなら、値を適切にエスケープしてからdbに渡すことができるからです。 –

42

あなたは構文にすべて間違っを持っています。

+3

+1あなたは私より速かった:) –

+0

これは受け入れられた答えでなければなりません。 –

10

これが正しい方法である:

import MySQLdb 

if __name__ == '__main__': 
    connect = MySQLdb.connect(host="localhost", port=3306, 
           user="xxx", passwd="xxx", db='xxx', charset='utf8') 

    cursor = connect.cursor() 

    cursor.execute(""" 
     UPDATE tblTableName 
     SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
     WHERE Server=%s 
    """, (Year, Month, Day, Hour, Minute, ServerID)) 

    connect.commit() 
    connect.close() 

P.S. connect.commit()を忘れないでください。そうでないと動作しません。

+0

コミットなしで動作します – emir

+0

コミットせずに動作しません、私はpython 3.5を使用します – Belter

3

いずれも何らかの理由で私のために働いていません。

私は何らかの理由でpythonが%sを読んでいないことを理解しました。したがって、SQLコードでは%Sの代わりに(?)を使用してください。

最後にこれは私のために働いた。

cursor.execute ("update tablename set columnName = (?) where ID = (?) ",("test4","4")) 
    cursor.commit() 
関連する問題