2016年7月2日土曜日

Raspberry PiのPython3でSqliteを使う

Raspberry PiのPython3で、データベースとしてSQliteを使うことにした。Linuxでデータベースといえば、MySQLやPostgreSQLがよくあげられるが、データベースにアクセスするのはRaspberry Pi上で動かすPythonのみで、データ量もたいしたものではない。機能は基本的なもので十分で、動作が軽く、簡単に管理できるデータベースが望ましい。というわけでSQliteを選択した。

SQiteは、アプリに組み込んで使用できるデータベースで、機能的にはMySQLやPostgreSQLには劣るものの、サーバータイプのMySQLやPostgreSQLに比べて軽量で管理が簡単。

Python3で使用するにはインストールは不要。SQliteのライブラリがデフォルトである。ただ、コマンドラインでもデータベースを操作できるようにするため、今回はSQliteをインストールする。


SQliteのインストールとコマンドラインからの操作


最新バージョンのSQlite3をインストール。コマンドは以下の通り。


コマンドラインからデータベースを開くときは、sqlite3に続けてデータベースのファイル名を指定する。ファイルがなければ新規作成される。


sqlite>に続けてSQLを入力して実行する。終了するときは.exit(はじめにピリオドが必要)。



PythonからのSQliteの操作


以下はテーブル作成してデータをインサートし、テーブルからデータを取得するサンプルコード。SQliteのデータ型についてはSQliteのサイトを参照。

# sqlite3ライブラリインポート
import sqlite3

# データベースファイル(test.db)を開く(ファイルがないときは新しいファイルを作成する)
con = sqlite3.connect( "test.db" )

# select文でフェッチしたデータをカラム名で取得できるようにする
con.row_factory = sqlite3.Row;

# cursorインスタンス作成
cur = con.cursor()

# テーブル作成SQLの実行
cur.execute( "create table test (date text, id integer, temp float )" );

data = [('2016-04-01', 1, 44.6 ),
         ('2016-05-21', 333, -7.0 ),
         ('2016-06-30', 77777, 99.9 ),
        ]

# SQLを複数まとめて実行するときはexecutemanyを使う
# 変数でSQL文を作成するときはプレースホルダ(?)を使う
cur.executemany( "insert into test values (?,?,?)", data )

# commit
con.commit();

dt = ('2016-05-21',)
# select文の実行
cur.execute( "select * from test where date=?;", dt )

# select文でフェッチしたデータの表示
for row in cur:
    print( row['date'], row['id'], row['temp'] );

con.close()

ここで注意することは、SQL文をつくるときに以下のようにするとSQLインジェクションのリスクをつくることになるので使わない。代わりに上記サンプルにあるようにプレースホルダ(?)を使う。
dt = '2016-05-21'
cur.execute("SELECT * FROM test WHERE date = '%s'" % dt)

実行結果


上記のサンプル(sample.py)を実行すると以下の結果が出力される。


コマンドラインからテーブルの内容を確認してみる。


0 件のコメント:

コメントを投稿