我正在使用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是已更改行的数量,因此=(
谢谢!
答案 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
,这将返回匹配行的数量。然后执行更新。在相同游标中运行的所有查询都是同一事务的一部分,因此可以保证在查询之间不会有其他进程写入数据库。
答案 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”)