2

私は python2.6 と MySQLdb を使用しています。このデータを含むテーブルがあります

+----+--------+
| id | status |
+----+--------+
| 1  |     A  |
| 2  |     B  |
| 3  |     B  |
+----+--------+

次の例のように mysql を更新したいと考えています。

UPDATE my_table SET status = "A" where id in (1,2,3,10001);
Query OK, 2 rows affected (0.03 sec)
Rows matched: 3  Changed: 2  Warnings: 0

そして、更新のすべての ID がデータベースに存在するかどうかを知る必要があります。この情報を取得するための私の考えは、更新しようとしたアイテムの数と一致した行の数を比較することでした。この例では、数字は 4 対 3 です。

問題は、カーソル情報から「一致した行」を取得する方法がわからないことです。この情報は、cursor._info = '一致した行: 3 変更: 2 警告: 0' にのみ表示されます。

cursor.rowcount は変更された行の数なので、=(

ありがとう!

4

2 に答える 2

1

cursor._infoにその文字列が含まれている場合は、正規表現を使用して3を抽出できます。re.search(r'Rows matched: (\d+)', cursor._info).group(1)

または、(トランザクションをサポートする)InnoDBテーブルを使用している場合は、2つのクエリを実行できます。最初はちょうどSELECT id FROM my_table WHERE id in (1,2,3,10001)、次にgetcursor.rowcountは、一致する行の数を返します。次に、更新を実行します。同じカーソルで実行されるすべてのクエリは同じトランザクションの一部であるため、他のプロセスがクエリ間にデータベースを書き込まないことが保証されます。

出典: http: //zetcode.com/databases/mysqlpythontutorial/を参照

于 2011-07-28T15:36:55.410 に答える
1

FOUND_ROWS オプションはcursor.rowcount、代わりに一致した行の数を返します。

db_connection = MySQLdb.connect(
        host = settings['dbHost'],
        user = settings['dbUser'],
        passwd = settings['dbPass'],
        db = settings['dbName'],
        client_flag = MySQLdb.constants.CLIENT.FOUND_ROWS
        )

ドキュメント:

http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb.constants.CLIENT-module.html http://dev.mysql.com/doc/refman/5.6/en/mysql-real -connect.html

(MySQLdb ドキュメントにタイプミスがあります。「client_flags」は「client_flag」にする必要があります)

于 2014-10-31T10:11:56.973 に答える