0

mariadbにContainerという名前のテーブルがあり、container_id 、mt_dateage3つのフィールドがあります。

私がやろうとしているのは、データベースがロードされるたびに、特定の container_id に対応する age フィールドに新しい値を更新/設定することです。age と対応する container_id をそれぞれ値とキーとして Python 辞書に保持しました。辞書をループして、このように年齢を更新しようとするよりも-

for i in list(age_dict):
    frappe.db.sql("update Container set age = age_dict[i] where container_id = i")

ここで、frappe.db.sql()は、私のフレームワークの db 接続コマンドです。

このエラーメッセージが常に表示されます-

ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[i] where container_id = i' at line 1")

SQL クエリ コードを何度か確認しましたが、構文エラーが見つかりませんでした。助けを求めています。

4

1 に答える 1

3

SQL ステートメント内にある Python コードは解釈されません。データベースは文字通りコマンドを実行しようとしていますが、update Container set age = age_dict[i] where container_id = iこれは実際には無効な構文です。パラメータ化を使用する必要があります。これにより、SQL インジェクションを防ぎ、SQL コマンドを簡単にフォーマットできます。構文は文字列補間とほぼ同じですが、値を ( tupleとして) 2 番目のパラメーターとしてに渡しますfrappe.db.sql()

for key in list(age_dict):
    frappe.db.sql(
        "update Container set age = %s where container_id = %s",
        (age_dict[key], key)
    )
于 2015-12-19T05:00:07.367 に答える