[Python][MySQL] row_count() で changed ではなく matched の値を取得する

update など実行するとRows matched: 1 Changed: 0 Warnings: 0のような結果になることがありますが、 通常はrow_count()を実行してもChanged0が返ってくるので、 matched1を返してくれるようにする方法です。 方法としては単純で、接続時にCLIENT_FOUND_ROWSフラグを設定します。

環境

  • MySQL 5.6.15
  • Python 3.4.2
  • MySQL Connector/Python 2.0.2

コード

サンプルコードです。SQL はテキトーで、最初の方はサンプルで使うテーブルを作ってるだけです。

import mysql.connector

options = {
	'host': '127.0.0.1',
	'user': 'root',
	'password': 'pass',
	'database': 'dbname',
	'charset': 'utf8',
}
connect = mysql.connector.connect(**options)
cursor = connect.cursor(dictionary=True)
result = cursor.execute('''
drop table if exists users;
create table users(
	id int primary key,
	name varchar(255)
);
insert into users(id, name) values(1, 'admin'), (2, 'testuser'), (3, 'mysql');
commit;
''', multi=True)
for d in result:
	print(d)

connect.start_transaction()
cursor.execute("update users set name = 'administrator' where id = %(id)s", {'id': 1})
# cursor.execute("select row_count() as row")
# print(cursor.fetchone()['row'])  # 1
print(cursor.rowcount)  # 1

cursor.execute("update users set name = 'administrator' where id = %(id)s", {'id': 1})
# cursor.execute("select row_count() as row")
# print(cursor.fetchone()['row'])  # 0
print(cursor.rowcount)  # 0, 変更された行数
connect.rollback()

# mysql.connector.ClientFlag.FOUND_ROWS を設定する
connect.set_client_flags([mysql.connector.ClientFlag.FOUND_ROWS])
# 途中で設定した場合は reconnect しないと反映されない
connect.reconnect()

connect.start_transaction()
cursor.execute("update users set name = 'administrator' where id = %(id)s", {'id': 1})
print(cursor.rowcount)  # 1

cursor.execute("update users set name = 'administrator' where id = %(id)s", {'id': 1})
print(cursor.rowcount)  # 1, 条件に一致した行数
connect.commit()

cursor.close()
connect.close()

set_client_flagsを使ってmysql.connector.ClientFlag.FOUND_ROWSを指定します。 リストで渡さないとエラーになります。

options = {
	'host': '127.0.0.1',
	'user': 'root',
	'password': 'mik1225',
	'database': 'samples',
	'charset': 'utf8',
	'client_flags': [mysql.connector.ClientFlag.FOUND_ROWS],
}
connect = mysql.connector.connect(**options)

最初の接続時に指定する場合はclient_flagsという名前で指定します。

参考

Trackbacks & Pingbacks

  • None

Comments

  • No Comment
Name
Mail(任意) 公開されません
Web Site(任意)
Comment

日本語が含まれない投稿は無視されますのでご注意ください