PythonでSQLite3を試す
Python2.7と3.5で動作するサンプルコードです。
SQLiteとは?
Oracle, MySQL, PostgreSQL, MariaDB などよりも軽量に動作し、アプリに組み込むなどして使われているようです。経験上デスクトップで確認したい場合や一時的に利用したい場合などに使うこともありました。SQLで操作します。メモリ管理も任せられるのでデータが多い場合、自前でテキストファイルで操作するよりもSQLiteを選択すると良い場合があります。
Python2 と Python3 で動作するサンプルコード
# -*- 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ファイルはスクリプトと同じディレクトリ内にあるものとします。
os.path.dirname(__file__)
でスクリプトのあるディレクトリ部分を取得します。base_dir
がカラの際はカレントディレクトリを示す.
を代入します。os.path.sep
はOSで利用されているディレクトリの区切り文字で、Windowsなら\
になります。
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
- Python 2: http://docs.python.jp/2/library/sqlite3.html#using-the-connection-as-a-context-manager
- Python 3: http://docs.python.jp/3/library/sqlite3.html#using-the-connection-as-a-context-manager
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引数にジェネレータを渡しています。
イテレータやタプルのリストを渡してまとめてデータ登録します。