如何从MySQLdb.cursors.Cursor python2.6获得匹配的行

时间:2011-07-28 00:38:53

标签: python cursor mysql-python rowcount

我正在使用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是已更改行的数量,因此=(

谢谢!

2 个答案:

答案 0 :(得分:1)

如果cursor._info包含该字符串,那么您只需使用正则表达式提取3:re.search(r'Rows matched: (\d+)', cursor._info).group(1)

或者,如果您使用InnoDB表(支持事务),则可以执行两个查询:首先只是SELECT id FROM my_table WHERE id in (1,2,3,10001)然后获取cursor.rowcount,这将返回匹配行的数量。然后执行更新。在相同游标中运行的所有查询都是同一事务的一部分,因此可以保证在查询之间不会有其他进程写入数据库。

来源:见http://zetcode.com/databases/mysqlpythontutorial/

答案 1 :(得分: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”)