読者です 読者をやめる 読者になる 読者になる

SQLSoupで既存のデータベースを参照する

Python

既存のデータベースのテーブルを参照するのに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')]

これだけでデータベースをさわれるので、とても簡単でいいですね。