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 = 'Rows match: 3 Changed: 2 Warnings: 0' 中看到此信息。

cursor.rowcount 是更改的行数,所以 =(

谢谢!

4

2 回答 2

1

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

或者,如果您使用 InnoDB 表(支持事务),则可以执行两个查询:首先是 just SELECT id FROM my_table WHERE id in (1,2,3,10001),然后是 get cursor.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 回答