sqlite3のexecutemanyの動作確認
1回で10万件を挿入するのに、0.35秒。
別実行した1件ソートの繰り返しでは0.42秒。大した差ではないが、ループを組まなくていいメリットあり。
値を埋めたいところは、"INSERT INTO users VALUES(?,?,?)" のようにハテナにしておく。
リストのリストや、タプルのリストにしておけば、全件Insertしてくれるようす。
プログラム
import sqlite3 from faker import Faker import random from datetime import datetime con = sqlite3.connect(":memory:") con.isolation_level = None # None で自動コミットモード cur = con.cursor() cur.execute('PRAGMA temp_store=MEMORY;') cur.execute('PRAGMA journal_mode=MEMORY;') listsize = 100000 sql_create = "CREATE TABLE users(number INTEGER, name TEXT, score REAL)" sql_instert = "INSERT INTO users VALUES(?,?,?)" sql_select = "SELECT number,name,score FROM users ORDER BY number LIMIT 3" sql_select_last = "SELECT number,name,score FROM users ORDER BY number LIMIT 3 OFFSET {0}".format(listsize-3) list1 = [None] * listsize fake = Faker() print("データ準備 開始") for i in range(listsize): list1[i] = [i, fake.name(), random.random()] print("データ準備 完了") cur.execute(sql_create) print("テーブルの定義を表示") tmp = cur.execute("SELECT * FROM sqlite_master WHERE type='table'").fetchall() print(tmp) # ここからexecutemany時間計測 tic = datetime.now() print("データの挿入") cur.executemany(sql_instert, list1) # executemany時間計測終わり toc = datetime.now() cur.execute(sql_select) print("テーブルの中身を表示") print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchone()) print() cur.execute(sql_select_last) print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchone()) print() print("executemany {0}件 処理時間 {1}".format(listsize, toc-tic)) con.close()
実行結果
(base) C:\dev\SampleCodes\hello_sqlite>python execmeny.py データ準備 開始 データ準備 完了 テーブルの定義を表示 [('table', 'users', 'users', 2, 'CREATE TABLE users(number INTEGER, name TEXT, score REAL)')] データの挿入 テーブルの中身を表示 (0, 'Dawn West', 0.5244752623689407) (1, 'Marvin Chambers', 0.8354440852719125) (2, 'Clinton Lowe', 0.4116042084368037) (99997, 'Aaron Conley', 0.795391969430207) (99998, 'Alyssa Brooks', 0.17316654138026266) (99999, 'Marisa Peterson', 0.018786705346994004) executemany 100000件 処理時間 0:00:00.350097