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

SqlSoupを味わう

Python SQLAlchemy

 SQLAlchemyには、Engine, Table, MetaData, Session, SessionContext, Mapperと言ったDBアクセスのための抽象オブジェクトが多々あり、DBにアクセスするまで様々な事前処理を行わなくてはならず、それが最初のハードルになっているように思われます。
 SqlSoupはそうした事前処理の面倒を見てくれる便利なモジュールです。「セッション」に対してではなく、「データベース」に対して操作を行うようなインターフェイス設計になっているため、概念的にも理解し易いと思います。


 引き続き、前々エントリのスキーマを用いて、練習してみます。

from sqlalchemy.ext.sqlsoup import SqlSoup

# 「データベース」オブジェクトを生成
db = SqlSoup("mysql://username:password@localhost/dbname")

# デバッグ用にログ出力を有効に
db.engine.echo = True

# catテーブルからすべての行を取得
cats = db.cat.select()

#シーケンスcatsの要素は、自動的に生成されたMappedCatクラスのインスタンス
print cats[0].name


 SqlSoupを使うと、データベースのテーブルがSqlSoupオブジェクトのプロパティであるかのように扱えます。上の例では、"SELECT * FROM cat"を実行して、Pythonオブジェクトへのマッピングを行うという処理を、db.cat.select()だけで実行しているわけです。


 テーブル行の変更を行うには、SqlSoupを通して得られたMappedオブジェクトのプロパティを変更し、dbのflush()メソッドを実行します。

# 主キー1の行を取得
c = db.cat.get(1)

# 該当オブジェクトの名前を変更
c.name = "SPAM"

# ここでクエリを実行、コミット
db.flush()


 または次のような形式も使えます。この場合、明示的にdb.flush()を呼ばなくても、自動的にコミットされます。

# 即時Update & Commit
db.cat.update(db.cat.c.id==1, name="Ham")


 行を削除するには、db.delete()メソッドを使います。

c = db.cat.get(1)

# 主キーが1の行を削除
db.delete(c)

# ここでクエリを実行、コミット
db.flush()

# または
db.cat.delete(db.cat.c.id==5)


 insertの事例や、表結合など用いたクエリなど、より複雑な事例に関しては、以下のページに記載があります。


SQLAlchemy WikiのSqlSoupについてのドキュメント
http://www.sqlalchemy.org/trac/wiki/SqlSoup

PyCon2007での紹介資料
http://spyced.blogspot.com/2007/02/pycon-sqlsoup-slides.html