はじめに
- ローカルにあるCSV(or TSV)ファイル、キー列でJOINしたり重複確認とかしたいなぁ...
- でも自由気ままに使えるDBなんてないし...
- そこまででかいデータでもないんだから、お手軽な方法ないかしら...
このようなことでお悩みのあなたへ、SQLiteというDBを使って、ローカルで簡単にDBを立ててデータをインポートしSQLを発行できる方法をご案内します。
※テキストファイルをインポートする方法については以下の記事にてご紹介!
PythonでCSV,TSVファイルをSQLiteにインポートする方法
SQLiteってなに?
- インストールも簡単で軽量なDBMS
- 組み込み系デバイスにも頻出。IoTと相性Good
- DjangoなどのWeb用DBとしても用いられることも
- PostgreSQLやMySQLといったメジャーなDBMSとは期待される役割が違う
- Pythonに標準装備されている
そう!このSQLiteはPythonをインストールした時点ですでに使えるのです。
というわけで、ここからはPythonを使ってローカルにお手軽DBを作ってSQLを打ち放題にする方法をご紹介します!
(以下はPython3.7がローカルにあることを前提とします。Python3系であれば使えるはず)
基本的な使い方
作成からアクセスまで
まずはDBの作成からアクセス、切断までの操作方法一覧。
import sqlite3
# 接続先となるDBの名前。'/home/user/database.db'といった表現方法も可能。
dbname = 'database.db'
# コネクタ作成。dbnameの名前を持つDBへ接続する。
conn = sqlite3.connect(dbname)
cur = conn.cursor()
# ここから好きなだけクエリを打つ
cur.execute('create table students(id integer, name text);')
# 処理をコミット
conn.commit()
# 接続を切断
conn.close()
DBにアクセスしたとき、もし指し先にDBファイルがなかった場合自動でDBが作成されます。
「DBが作成される」とはSQLite用のバイナリファイルが作成されるということを意味します。つまり接続先となるDBはただのファイルであり、接続先の表現方法はパスでそのファイルの位置を表現するということになります。
これはファイルをそのまま移動(mv)や複製(cp)すれば、どこでもデータを持ち運べるということでもあります。
拡張子は自由ですが、ここでは慣例で".db"を使っています。
テーブル操作方法
# CREATE TABLE
cur.execute('create table students(id integer, name text, class text)')
# 列追加
cur.execute('alter table students add column blood_type text')
# 行追加
cur.execute("insert into students values(1, 'Mike', 'Moon', 'B')")
# 連続したレコードの追加
students_data = [(2, 'Bob', 'Song', 'A'),
(3, 'Gonzalez', 'Star', None)]
cur.executemany("insert into students values (?, ?, ?, ?)", students_data)
# テーブル消去
cur.execute("drop table students")
executemanyメソッドは便利です。上のサンプルではタプルの入った一次元配列ですが、二次元配列でも同様にインサートできます。
(Python上での処理結果をそのまま流し込むのにも使えそう)
# 値の取得方法1
table = cur.execute('select * from students')
data = table.fetchall()
print(data)
# 値の取得方法2
for data in cur.execute('select * from students'):
print(data)
テーブルのデータを取得したいときは、selectしたあとfetchall()をします。イテレータとしても使えます。
取り出した値はタプルあるいはタプルを要素とした配列になっています。
CSV,TSVファイルをインポートする方法
以下をご覧ください!
PythonでCSV,TSVファイルをSQLiteにインポートする方法
おしまい。