Как получить соответствующие строки из MySQLdb.cursors.Cursor python2.6 - PullRequest
2 голосов
/ 28 июля 2011

Я работаю с 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

И мне нужно знать, все ли идентификаторы в обновлении выходбаза данных.Моя идея получить эту информацию состояла в том, чтобы сравнить количество элементов, которые я пытался обновить, с количеством совпадающих строк.В этом примере числа 4 против 3.

Проблема в том, что я не знаю, как получить "Соответствующие строки" из информации о курсоре.Я вижу эту информацию только в cursor._info = 'Соответствия строк: 3 Изменено: 2 Предупреждения: 0'.

cursor.rowcount - это количество измененных строк, поэтому = (

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 октября 2014

Опция 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
        )

Docs:

http://mysql -python.sourceforge.net / MySQLdb-1.2.2 / государственные / MySQLdb.constants.CLIENT-module.html http://dev.mysql.com/doc/refman/5.6/en/mysql-real-connect.html

(В документации по MySQLdb есть опечатка. "Client_flags" должно быть "client_flag")

1 голос
/ 28 июля 2011

Если 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/

...