dataset っていう Python でデータベースを簡単に扱うライブラリがある。
雰囲気的には以前書いた MoSQL と似た感じ。
dataset: databases for lazy people — dataset 1.0.8 documentation
こっちはバックエンドに SQLAlchemy を利用している。
ドキュメントには MySQL を使う場合は MySQL-db が必須とかいてあるが、SQLAlchemy なので、PyMySQL でも行ける。
# -*- coding: utf-8 -*- import dataset db = dataset.connect('mysql+pymysql://foo:foo_password@localhost/bar_table?charset=utf8&use_unicode=0') users = db['users'] for user in users: print user['name']
これで Users テーブルの中身を全て取得して、その中で name カラムを表示してる。
簡単簡単。
と思いきや文字コードが utf-8 なテーブルの場合文字化けが発生する。
原因は簡単で、db.connect() を実行した際に、SQLAlchemy の create_engine() を呼んでいるが、それが URL のクエリ部分をごっそり削ってる。
なので、こういうパッチを当てれば動く。
--- database.py.orig 2013-11-16 00:55:53.000000000 +0900 +++ database.py 2013-11-16 00:55:46.000000000 +0900 @@ -24,6 +24,7 @@ kw['poolclass'] = NullPool self.lock = threading.RLock() self.local = threading.local() + original_url = url if '?' in url: url, query = url.split('?', 1) query = parse_qs(query) @@ -33,7 +34,7 @@ if len(schema_qs): schema = schema_qs.pop() self.schema = schema - engine = create_engine(url, **kw) + engine = create_engine(original_url, **kw) self.url = url self.engine = construct_engine(engine) self.metadata = MetaData(schema=schema)
ワークアラウンドだけど…。
これ報告した方がいいのかなぁ。
とりあえず報告してみるか。
追記:
とりあえず報告した。
2013/11/16 追記:
Fix tests; pass url query args to create_engine. Fixes #40 · pudo/dataset@b7bbde4 · GitHub
で修正してくれた。