既存のデータベースのテーブルを参照するのにSQLAlchemyを使おうと思っていたら、 @aodag からSQLSoupというモジュールがあるよと教えてもらったので試してました。
SQLSoupはSQLAlchemyに依存していて(元々はSQLAlchemyの拡張で、最近分離された)、SQLAlchemyのテーブルやマッパー定義をしなくても、簡単にデータベースのテーブルを参照できます。
http://pypi.python.org/pypi/sqlsoup
Welcome to SQLSoup’s documentation! — SQLSoup 0.9.0 documentation
インストール
インストールはpipなどで sqlsoup という名前を指定する。
$ pip install sqlsoup
依存でSQLAlchemyもインストールされる。データベースドライバは別途必要なものをそれぞれインストールしておく。
既存のデータベースを参照してみる
今回試したのはMySQL5.5、mysql-pythonで接続する。
まずはテスト用に参照するデータベースを用意しておく。
$ mysql -u root mysql> create database test;
data.sql
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, PRIMARY KEY(id) ); CREATE TABLE user_config ( id INTEGER NOT NULL AUTO_INCREMENT, user_id INTEGER NOT NULL, name VARCHAR(20) NOT NULL, value VARCHAR(20), PRIMARY KEY(id) ); INSERT INTO user (id, name) VALUES (1, 'User1'), (2, 'User2'); INSERT INTO user_config (user_id, name, value) VALUES (1, 'Key1', 'Value1'), (1, 'Key2', 'Value2'), (2, 'foo', 'bar');
データ投入
$ mysql -u root test < data.sql
対話モードで試す
sqlsoup.SQLSoupクラスからSQLAlchemyのQueryを使える。
メンバー名と一致するテーブル名が参照される。
>>> import sqlsoup >>> db = sqlsoup.SQLSoup('mysql://root@localhost/test?charset=utf8') >>> db.user.all() [MappedUser(id=1L,name=u'User1'), MappedUser(id=2L,name=u'User2')] >>> list(db.user_config.filter(db.user_config.user_id==1)) [MappedUser_config(id=1L,user_id=1L,name=u'Key1',value=u'Value1'), MappedUser_config(id=2L,user_id=1L,name=u'Key2',value=u'Value2')]
これだけでデータベースをさわれるので、とても簡単でいいですね。