2016-10-20 18 views
0

pythonのmysqlコネクタを使用して、SQLテーブルの単一のセルで単一の値を更新しようとしています。次のコードを使用すると、エラーメッセージは表示されませんが、テーブルは実際に更新されません。私が更新しようとしているセルの値は時々空で、時にはNULLで、時には文字列を含んでいることがあります。私のコードは以下の通りです:mysqlのpythonモジュールを使用してSQLテーブルを更新する

query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id) 

私は間違っていますか?

編集:今までの返信をありがとう。私は、別のクエリで同様のコードを実行するのが効果的であるため、周囲のコードに問題があるとは思わない(SQLインジェクションの脆弱性の外で、私はこれを修正しました)。ここに私のコードがあります:

column_to_change = "column2" 
change_to_value = "james" 
id = "1234" 


cnx = mysql.connector.connect(user='user', password='password', 
          host='db.website.com', 
          database='database') 
cursor = cnx.cursor() 

query = ("UPDATE data_set SET %s = %s WHERE policy_key = %s") 

cursor.execute(query, (column_to_change, change_to_value, id)) 

cursor.close() 
cnx.close() 

これは関連していると、私が挿入しようとしているセルがVARCHAR(45)の形式になっていることがわかります。 (u'James '、)

私はchange_to_value = "(u'James'、)"を設定すると、次のエラーメッセージが表示されます。

mysql.connector.errors.ProgrammingError:1064(42000):SQLシンタックにエラーがあります。 'column1' = '(u \' James \ '、)'の近くで使用する正しい構文については、MariaDBサーバーのバージョンに対応するマニュアルを確認してください。WHERE id = '1234' '1行目

+0

hereを参照してください!また、 'commit()'を呼び出しましたか? – mata

+0

いいえ、私はcommit()を呼び出さなかったが、それを追加しただけで、編集で説明したのと同じエラーが表示されます。 –

+0

クエリパラメータのパラメータを使用する必要がありますが、識別子(テーブル名、列名)にパラメータを使用すると、異なる引用符(バッククォート)を使用するため、SQL構文エラーが発生します。 – mata

答えて

0

すべての手順、次のとおりです。

conn = pyodbc.connect("SERVER=my.server;DATABASE=my_database;UID=my_user;PWD=my_password;",ansi=True) 

cursor = conn.cursor() 

query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id) 

cursor.execute(query) 

そしてまた、あなたは、Pythonのバージョンによって、データベース

0

上で実行したいというよう.execute()にあなたの通過が同じであるSQLクエリを確認し、おそらくそれは、あなたの文字列の補間に問題があります。それ以外の場合は、カーソルを接続してクエリを正常に実行していない可能性があります。私はあなたのコード内の他の場所でクエリを実行していると仮定していますが、あなたはありません、インスタンスには、この作業をする必要があります:あなたが行ったようにまた

cursor.execute (""" 
    UPDATE data_set 
    SET %s=%s 
    WHERE id=%s 
""", (column_to_change, change_to_value, row_id)) 

は、あなたが変数にこのクエリを保存することができ、それぞれの割り当て後で次のように実行してください。

query = (“UPDATE data_set SET %s=%s WHERE id=%s”) 

column_to_change = [YOUR ASSIGNMENT HERE] 
change_to_value = [YOUR ASSIGNMENT HERE--if this is a string, it should be formatted as such here] 
row_id = [YOUR ASSIGNMENT HERE] 

cursor.execute(query, (column_to_change, change_to_value, row_id)) 

基本的な文字列補間はSQLインジェクションが起こりやすく、避けてください。複数の基準については

は、あなたが文字列フォーマットを使用して作成したユーザパラメータ化クエリとはならない

+0

これはカラム名に対しては機能しません。カラム名はバッククォートをシングルクォートではなく、クォート文字として使用します。 – mata

関連する問題