So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

ラズパイ pythonでSQLite3 トランザクション [SQLポケリ]

前回、ラズパイにSQLite3を導入してみた。

  ラズパイにSQLiteをインストール

SQL命令「SELECT * FROM foo」の実行には成功した。
今回は、テーブルにINSERTで行を作成してみたいと思う。

withの使用

その前に、pythonのwith命令を使って、closeを行わないように改造する。
前回、紹介したpythonスクリプトは以下のようなものであった。

import sqlite3
 
con = sqlite3.connect('/home/pi/test.db')
cur = con.cursor()
cur.execute('SELECT * FROM foo')
for row in cur:
        print(row[0], row[1])
con.close()


connect()して作成したconオブジェクトは使用後、close()を呼び出して接続を解放する必要があるが、with命令を使うとclose()を自動的に呼び出してくれるので便利なわけである。
withを使って書き直したものが以下である。

import sqlite3
 
with sqlite3.connect('/home/pi/test.db') as con:
	cur = con.cursor()
	cur.execute('SELECT * FROM foo')
	for row in cur:
	        print(row[0], row[1])



トランザクションの分離レベル

次に、オートコミットを止める設定にする。オートコミットとなっているとSQLite側で自動的にトランザクション制御が行われる。色々実験したいので、オートコミットは切ってしまう。
connect()の第二引数で、isolation_levelをNoneに指定するとオートコミットを切ることができる。

import sqlite3
 
with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con:
	cur = con.cursor()
	cur.execute('SELECT * FROM foo')
	for row in cur:
	        print(row[0], row[1])


ここまでの時点では、SELECT命令しか実行していないので、オートコミットを切っても影響なし。

上記のスクリプトをコピーして、INSERTを行うスクリプトを2種類作成する。
最初は、トランザクション内で1件ごとに行をINSERTするスクリプトを作成する。

import sqlite3
import random
 
with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con:
        for i in range(0,1000):
                param = (int(random.random()*1000000), i)
                con.execute('BEGIN')
                con.execute('INSERT INTO foo VALUES(?,?)', param)
                con.execute('COMMIT')


これだと結構時間がかかる。timeコマンドで時間を計測して見た。

pi@raspberrypi:~ $ time ./testsqlite3.py 

real	0m37.104s
user	0m0.518s
sys	0m1.003s


1000行INSERTするのに、37秒もかかっている。
ちょっとかかり過ぎ。

トランザクションのかけ方を以下のように変更する。

import sqlite3
import random
 
with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con:
        con.execute('BEGIN')
        for i in range(0,1000):
                param = (int(random.random()*1000000), i)
                con.execute('INSERT INTO foo VALUES(?,?)', param)
        con.execute('COMMIT')


pythonだとインデントでループの範囲が変わってくるのでちょっと注意。
forループの前でトランザクションをかけて、ループ終了後にCOMMITする。

pi@raspberrypi:~ $ time ./testsqlite3-2.py

real	0m0.225s
user	0m0.169s
sys	0m0.019s


かなり速くなった。

SQLiteで大量のINSERTを行う場合は、トランザクションでまとめるべし。


[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)







関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版



サイト内を検索

nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

AREarthroidPro ARで地球を表示するアプリ

Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本