2

MySQL データベースがあり、DB API から SQLAlchemy に切り替えています。ドキュメントから、ResultProxy.rowcount は、UPDATE ステートメントによって影響を受ける行の数を報告することになっています。

このクエリを SQLAlchemy で実行すると:

UPDATE table
SET field =
IF(field < 10, 10, field) WHERE id = 1

一致する行がある場合は 1 の行数を返しますが、「フィールド」の任意の値に対して (10 以上の場合でも)。DB API でこのクエリを実行すると、影響を受ける行の正しい数が返されました (フィールドが 10 以上の場合は 0、それ以下の場合は 1)。

最初に選択クエリを実行して、変更があったかどうかを判断する必要があるため、問題が発生しています。SQLAlchemy のバグですか? ドキュメントには、一致する行の数ではなく、影響を受ける行の数を返す必要があることが明確に記載されています。

ありがとう。

4

1 に答える 1

0

MySQL の経験はありませんが、ドキュメントには次のROW_COUNT()ことが明らかにされています。

ステートメントの場合UPDATE、影響を受けた行のデフォルト値は、実際に変更された行数です。に接続するときに に CLIENT_FOUND_ROWSフラグを指定する と、影響を受ける行の値は「見つかった」行の数になります。つまり、WHERE 句によって一致します。mysql_real_connect()mysqld

したがって、接続の構成方法に応じて、結果は次の 2 つのいずれかになります。

  • WHERE「見つかった」行の数 (句に一致した行)
  • 実際に「更新された」行の数 (少なくとも 1 つの列の値が変更された場合)

sqlalchemy との関係については、これがバグなのか、それともドキュメントをより適切な表現で更新する必要があるだけなのかはわかりません。
いずれにせよ、SQL意味的に同じ別のステートメントでステートメントを書き直すことで問題を解決できます。

UPDATE  table
SET     field = 10
WHERE   id = 1
    AND field < 10
于 2012-06-12T07:31:07.767 に答える