ラズパイ pythonでSQLite3 トランザクション [SQLポケリ]
前回、ラズパイにSQLite3を導入してみた。
ラズパイにSQLiteをインストール
SQL命令「SELECT * FROM foo」の実行には成功した。
今回は、テーブルにINSERTで行を作成してみたいと思う。
withの使用
その前に、pythonのwith命令を使って、closeを行わないように改造する。
前回、紹介したpythonスクリプトは以下のようなものであった。
connect()して作成したconオブジェクトは使用後、close()を呼び出して接続を解放する必要があるが、with命令を使うとclose()を自動的に呼び出してくれるので便利なわけである。
withを使って書き直したものが以下である。
トランザクションの分離レベル
次に、オートコミットを止める設定にする。オートコミットとなっているとSQLite側で自動的にトランザクション制御が行われる。色々実験したいので、オートコミットは切ってしまう。
connect()の第二引数で、isolation_levelをNoneに指定するとオートコミットを切ることができる。
ここまでの時点では、SELECT命令しか実行していないので、オートコミットを切っても影響なし。
上記のスクリプトをコピーして、INSERTを行うスクリプトを2種類作成する。
最初は、トランザクション内で1件ごとに行をINSERTするスクリプトを作成する。
これだと結構時間がかかる。timeコマンドで時間を計測して見た。
1000行INSERTするのに、37秒もかかっている。
ちょっとかかり過ぎ。
トランザクションのかけ方を以下のように変更する。
pythonだとインデントでループの範囲が変わってくるのでちょっと注意。
forループの前でトランザクションをかけて、ループ終了後にCOMMITする。
かなり速くなった。
SQLiteで大量のINSERTを行う場合は、トランザクションでまとめるべし。
関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
ラズパイに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を行う場合は、トランザクションでまとめるべし。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0