はじめに
PythonでシンプルにDBへアクセスできる dataset を試しました。
前提条件
以下がインストール済みであることを前提とします。
- pipenv
- sqlite3
動作確認した環境のバージョンは以下のとおりです。
$ pipenv --version
pipenv, version 2018.11.26
$ sqlite3 --version
3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f
環境構築
$ mkdir sample && cd sample
$ pipenv --python 3.7
$ pipenv install dataset
$ cat <<EOF | sqlite3 ./sqlite3.db
CREATE TABLE depts(id integer primary key autoincrement, name text);
CREATE TABLE users(id integer primary key autoincrement, name text, email text, dept_id integer);
insert into depts (name) values ('A');
insert into depts (name) values ('B');
insert into depts (name) values ('C');
EOF
ソースコード
test.py
#!/usr/bin/env python
import dataset, traceback, json
db = dataset.connect('sqlite:///sqlite3.db')
users = db['users']
try:
db.begin()
users.delete()
users.insert(dict(name='test1', email='test1@example.com', dept_id=1))
users.insert(dict(name='test2', email='test2@example.com', dept_id=2))
users.insert(dict(name='test3', email='test3@example.com', dept_id=3))
users.insert(dict(name='test4', email='test3@example.com', dept_id=3))
users.insert(dict(name='test5', email='test3@example.com', dept_id=3))
db.commit()
except Exception as e:
traceback.print_exc()
db.rollback()
rows = db.query("""
select
u.id
, u.name
, u.email
, u.dept_id
, d.name as dept_name
from users u
left join depts d
on u.dept_id = d.id
where
u.dept_id = :dept_id
""", dept_id=3)
print("Result:")
for row in rows:
print(json.dumps(row))
実行
$ pipenv run python test.py
Result:
{"id": 3, "name": "test3", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
{"id": 4, "name": "test4", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
{"id": 5, "name": "test5", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
とてもシンプルに書けていい感じです!!