トレリスクラブの管理ツールを開発するプロセスでは、特定のゲームのすべての結果を無効にする機能が必要でした。 それは簡単かもしれません。 ゲームのステータスを変更し、プレイヤーの統計情報を使用して非正規化データをロールバックし、このデータに影響する操作キャッシュを無効にします。これは問題です。 しかし、PostgreSQLとpsycopg2の組み合わせには、このスコアに関する独自の意見があり、編集者の意見と一致しませんでした。
単純化された問題のあるクエリは次のようになりました。
cursor.execute("update pref_player set games=games-1, rating=rating-%s where player_id=%s", (rating, player_id))
つまり、ゲームの総数を減らし、このゲームで獲得したプレイヤーの評価を無効にする必要があります。 要求はパラメーター化されます。 定期的なスクリーニングpsycopg2。 間違いを犯す場所はないようです。 しかし、実際には、評価の値が負の場合、このリクエストは次のようになります。
update pref_player set games=games-1, rating=rating
つまり、EXPLOSIONが発生し、BASEが内臓に、さらにテキスト内で分割されます。 言い換えれば、ベースは幸運にもコメントとして2つの短所を取り、データをキャベツに分割しました。 そして、psycopg2ドライバーは、感嘆符なしでこの喜びをすべて逃しました。 おそらく、リクエストにコメントがあり、スクリーニングされたパラメーターの数が現実に対応していないと判断できたかもしれません。
とても簡単に扱われます。 rating = rating-%sの代わりに、たとえば、rating = rating-(%s)と言うだけで十分であり、すべてが正常に機能しますが、データベースドライバーによるパラメーター化されたクエリの処理における無条件の信頼の事実を疑問視する必要があります。
気をつけて、注意してください、そして力があなたと一緒にいるかもしれません。