MasterYodaの昼下がり

日々の備忘録的なアレ

pymysqlでbulkインサート

pymysqlでbulkインサートする方法メモ

executeの代わりにexecutemanyを使う
該当コードは以下
https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L136

PyMySQLのversionが0.6.1以下だとforループでexecute発行しているだけなので、versionを上げないとあまり意味がない。
0.6.1
https://github.com/PyMySQL/PyMySQL/blob/pymysql-0.6.1/pymysql/cursors.py#L106-112
0.6.2
https://github.com/PyMySQL/PyMySQL/blob/pymysql-0.6.2/pymysql/cursors.py#L136-181

PyMysqlのversionを上げるにはpipを使ってれば以下

pip install --upgrade pymysql
$ pip install --upgrade pymysql
Downloading/unpacking pymysql from https://pypi.python.org/packages/source/P/PyMySQL/PyMySQL-0.6.2.tar.gz#md5=5d7016e8f13e6c4edb539aa736896ffe
DownloadingPyMySQL-0.6.2.tar.gz (53kB):53kB downloaded
Running setup.py egg_info forpackage pymysql

Installing collected packages: pymysql
Found existing installation:PyMySQL0.6.1
UninstallingPyMySQL:
Successfully uninstalled PyMySQL
Running setup.py install for pymysql

Successfully installed pymysql
Cleaning up...
$

実装例

import pymysql
conn
=MySQLdb.connect()
cur
= conn.cursor()
sql
='INSERT INTO test VALUES (%s,%s,%s,%s)'
param
=[]
for data in target_datas:
param
.append([data[0],data[1],data[2],data[3]])
cur
.executemany(sql,param)
conn
.commit()

VALUES (%s)の%sをパラメータの数と合わせないといけないことに気づかず若干ハマった。(当たり前である。
gziip&msgpack化したデータをblob型へ突っ込むのもこのままでいける