2011-07-28 4 views
2

私はpython2.6とMySQLdbで作業しています。MySQLdb.cursors.Cursor python2.6から一致する行を取得する

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がデータベース内に終了した場合に知っておく必要があります。私は、この例のように、MySQLの更新をしたい、このデータを持つテーブル

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

を持っています。この情報を取得する私の考えは、私が更新しようとしたアイテムの数と一致した行の数を比較することでした。この例では、数字は4対3です。

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

cursor.rowcountがcursor._infoは、その文字列が含まれている場合、あなただけの正規表現と3を抽出することができますので、=(

おかげ

答えて

1

、変更された行の数です:!re.search(r'Rows matched: (\d+)', cursor._info).group(1)

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

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

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"はbです。 e「client_flag」)

関連する問題