dataset でマルチバイトが正しく処理されてない

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
で修正してくれた。