0

Python 用の mysql コネクタを使用して、SQL テーブル内の 1 つのセル内の 1 つの値を更新しようとしています。次のコードを使用すると、エラー メッセージは表示されませんが、テーブルが実際に更新されることもありません。更新しようとしているセルの値は、空の場合もあれば、NULL の場合もあり、文字列が含まれている場合もあります。これが私のコードです:

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) としてフォーマットされていることがわかります。セルで SELECT クエリを実行すると、次のような形式の名前が返されます: (u'James',)

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

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

4

2 に答える 2

0

Python のバージョンによっては、おそらく文字列補間の問題です。そうしないと、カーソルを接続してクエリを正常に実行できない可能性があります。コードの他の場所でクエリを実行していると仮定していますが、そうでない場合、これは機能するはずです。

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 インジェクションを起こしやすいため、避ける必要があります。

詳しくはこちら

于 2016-10-20T00:46:55.347 に答える