RaspbianではMySQLやPostgreSQLなどたいそうなボリュームにも対応できるDBが使えますが、今回はもっと軽量で手軽に扱えるSQLiteを使ってみます。
何らかの情報を事前に保存しておくためと、センサーなどから送られるデータをとにかく都度保存しておくためです。
SQLiteも限定的に使う(セキュリティを気にしない、項目数もそんなに多くなく1レコード100byte程度、データ量も100万オーダーなど….)なら問題ないようです。
またデータが溜まりすぎてSQLiteではいかんともしがたいという状況になったら、その時MySQLやPostgreSQLへの移行なんぞを考えます。データ移行時のトラブルを少なくしたいので、テーブル作成やデータ挿入時に特殊なデータ型や文字は使わないようにします。
SQLの発行をPythonでやってみます。
Pythonではver2.5からSQLite3が標準ライブラリーにはいっています。
1 2 |
$python3 >>>import sqlite3 |
エラーは起きないはず(^^)。
sqlite3 モジュールの詳細はこちらを参照
データの移動がさせやすいようにUSBメモリーに保存しておきます。
データベースの作成はいたって簡単です。
test.dbがお入用なら、接続を実行します(無ければ勝手に作ってくれます)。
XXXはUSBメモリーの名前(要確認)
$python3
>>> import sqlite3
>>> con = sqlite3.connect(“/media/pi/XXX/test.db”)
カーソル作成
>>> cur = con.cursor()
id,com,wav,ctrlという4つのカラムを持ったcom_infoというテーブルを作成してみます
>>> sql = u”create table com_info(id integer primary key autoincrement,com text,wav text,ctrl text)”
>>> cur.execute(sql);
テーブルのカラム情報を確認
>>> cur.execute(“pragma table_info(com_info)”)
>>> cols = cur.fetchall()
>>> print(cols)
ちなみに既存のテーブルを削除して新規に作成する場合(AAA -> BBB)
cur.executescript(“””drop table if exists AAA;create table BBB(com,wav,ctrl )”””)
データ挿入
>>> sql = u”insert into com_info values(null,’はい’, ‘hai.wav’, ‘com_yes.sh’)”
>>> cur.execute(sql)
あるいは、複数データをまとめて挿入する場合は
>>> data = [(null,’いいえ’, ‘iie.wav’, ‘com_no.sh’),(null,’さあ’, ‘sa.wav’, ‘com_sa.sh’)]
>>> sql = u”insert into com_info(id,com,wav,ctrl) values(?,?,?,?)”
>>> cur.executemany(sql,data)
コミット
>>> con.commit()
データ確認
>>> sql = “select * from com_info”
>>> cur.execute(sql)
>>> cur.fetchall()
>>> cur.close()
>>> con.close()
データを取り出してみます
XXXはUSBメモリーの名前(要確認)
【get_data.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/usr/bin/env python3 # -*- coding: utf-8 import sqlite3 def main(): # データベース開く con = sqlite3.connect('/media/pi/XXX/test.db') cur = con.cursor() # 全データ(レコード)取得 sql = 'select * from com_info' for row in cur.execute(sql): print(row) ''' #idが3のレコードで4カラム目のデータを取得する場合 sql = "select * from data_info where id=3" cur.execute(sql) row = cur.fetchone() print(row[3]) ''' # クローズ cur.close() con.close() if __name__ == "__main__": main() |
1 |
$python3 get_data.py |
事前にUSBメモリーが挿入されているかチェックする場合
import os.path
os.path.isfile(“/media/pi/XXX”)
# => False
os.path.isfile(“/media/pi/XXX/test.db”)
# => True
OR
os.path.isdir(“/media/pi/XXX”)
# => True
os.path.isdir(“/media/pi/XXX/test.db”)
# => False
データ削除
2番目のデータを削除してみます。
cur.execute(‘delete from com_info where id=?’, (2,))
cur.execute(‘select * from com_info’)
cur.fetchall()
ダンプファイル作成
【dump.py】
1 2 3 4 5 6 |
import sqlite3 con = sqlite3.connect("/media/pi/XXX/test.db") <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'dump.sql'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">con</span><span class="o">.</span><span class="n">iterdump</span><span class="p">():</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">line</span><span class="p">)</span> |
1 2 3 |
$python3 dump.py 以下は例です |
【dump.sql】
BEGIN TRANSACTION;
CREATE TABLE data_info(id integer primary key autoincrement,datetime integer,tempreture real,pressure real,humidity real,temp_mix real,temp_max real,wind_speed real,wind_degree real,cloud real,description text);
INSERT INTO “data_info” VALUES(1,1550640883,14.98,1016.0,72.0,13.0,16.0,6.7,270.0,20.0,’few clouds’);
INSERT INTO “data_info” VALUES(2,1550641031,14.98,1016.0,72.0,13.0,16.0,6.7,270.0,20.0,’few clouds’);
INSERT INTO “data_info” VALUES(3,1550643002,14.76,1015.0,67.0,13.0,17.0,5.1,340.0,75.0,’broken clouds’);
INSERT INTO “data_info” VALUES(4,1550646002,14.5,1015.0,67.0,13.0,16.0,5.1,350.0,75.0,’broken clouds’);
・
・
・
・
DELETE FROM “sqlite_sequence”;
INSERT INTO “sqlite_sequence” VALUES(‘data_info’,65);
COMMIT;
Leave a Reply