PythonでSQLite3を試す

Python2.7と3.5で動作するサンプルコードです。

SQLiteとは?

Oracle, MySQL, PostgreSQL, MariaDB などよりも軽量に動作し、アプリに組み込むなどして使われているようです。経験上デスクトップで確認したい場合や一時的に利用したい場合などに使うこともありました。SQLで操作します。メモリ管理も任せられるのでデータが多い場合、自前でテキストファイルで操作するよりもSQLiteを選択すると良い場合があります。

Python2 と Python3 で動作するサンプルコード

  • sqlite3モジュール 2.x 3.x を利用します。
# -*- coding: utf-8 -*-
import datetime, os, random, sqlite3, sys

if __name__ != '__main__':
    sys.exit()

db_file = 'example.db'

base_dir = os.path.dirname(__file__)
if not base_dir:
    base_dir = '.'

db_path = base_dir + os.path.sep + db_file
# db_pathが存在しなければTrue, 新規作成
db_is_new = not os.path.exists(db_path)

# 新規作成時にINSERTするデータ
def new_date():
    for i in range(10):
        yield (i + 1, int(random.random() * 100), datetime.datetime.now())

# db_pathが無ければスクリプトと同じディレクトリ内に自動で作成
conn = sqlite3.connect(db_path)

# db_pathが新たに作られた時
if db_is_new:
    # テーブル作成
    conn.execute('''
CREATE TABLE example(
    id INTEGER,
    num INTEGER,
    date TEXT
)
    ''')

    try:
        # with文終了時はcommit
        with conn:
            # データ投入
            conn.executemany('''
INSERT INTO example VALUES(?, ?, ?)
            ''', new_date())
    except sqlite3.IntegrityError:
        # 例外発生時はrollback
        pass

# カラム名で参照できるようにsqlite3.Rowを使用
conn.row_factory = sqlite3.Row

# SELECTしたデータを1行ずつ出力
for row in conn.execute('SELECT * FROM example'):
    r = ['%s = %s' % (k, row[k]) for k in row.keys()]
    print(', '.join(r))

conn.close()

importで呼ばれた場合は終了します。

  • このスクリプトは直接実行する前提ですのでimportで呼ばれた場合は終了します。
if __name__ != '__main__':
    sys.exit()

dbファイルはスクリプトと同じディレクトリ内にあるものとします。

db_file = 'example.db'

base_dir = os.path.dirname(__file__)
if not base_dir:
    base_dir = '.'

db_path = base_dir + os.path.sep + db_file

dbファイルが無い場合は新規に作成されます。

  • dbファイルの存在確認でまだファイルが無い場合、新たに作るものと判断しテーブルの作成などに利用します。
# db_pathが存在しなければTrue, 新規作成
db_is_new = not os.path.exists(db_path)

sqlite3.connect()で取得するConnectionオブジェクトをコンテキストマネージャーとして利用しています。

    try:
        # with文終了時はcommit
        with conn:
            pass
    except sqlite3.IntegrityError:
        # 例外発生時はrollback
        pass

conn.executemany()で複数データをまとめてINSERTしています。

# 新規作成時にINSERTするデータ
def new_date():
    for i in range(10):
        yield (i + 1, int(random.random() * 100), datetime.datetime.now())
            # データ投入
            conn.executemany('''
INSERT INTO example VALUES(?, ?, ?)
            ''', new_date())
  • サンプルコードでは第2引数にジェネレータを渡しています。
    イテレータやタプルのリストを渡してまとめてデータ登録します。