ラズパイ3でデータベース(SQLite)


RaspbianではMySQLやPostgreSQLなどたいそうなボリュームにも対応できるDBが使えますが、今回はもっと軽量で手軽に扱えるSQLiteを使ってみます。

何らかの情報を事前に保存しておくためと、センサーなどから送られるデータをとにかく都度保存しておくためです。

それにデータをSDカードに保存するのはちょっと危険。特に現行のラズパイのようにカードが完全に格納されず取り出しやすいように露出しているものは破損する可能性大(雑な性格の管理人はラズパイをいじっているうちにぶつけてしまい、衝撃で16GBにクラックが入ってしまいました…とさ)

 

SQLiteも限定的に使う(セキュリティを気にしない、項目数もそんなに多くなく1レコード100byte程度、データ量も100万オーダーなど….)なら問題ないようです。

またデータが溜まりすぎてSQLiteではいかんともしがたいという状況になったら、その時MySQLやPostgreSQLへの移行なんぞを考えます。データ移行時のトラブルを少なくしたいので、テーブル作成やデータ挿入時に特殊なデータ型や文字は使わないようにします。

SQLの発行をPythonでやってみます。

Pythonではver2.5から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】

 

 


事前に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】

 

 

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;


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*