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

0.4のSession関連の変更点

SQLAlchemy

先日、SQLAlchemyの0.4ベータ配布がアナウンスされたので、ようやく0.4の変更点を一通り眺めてみました。Googleグループでの議論はある程度追いかけていましたが、ここまで大きく変わると変更に追随するのに気が重くなりますね。


変更点は、以下の文書にまとまっています。

Whats New in 0.4
http://www.sqlalchemy.org/trac/wiki/WhatsNewIn04


SAContextもSQLAlchemy0.4のAPIが安定するまで開発を中断しているようでしたが、これからまた再開されるのでしょうか。こちらにも注目。

SAContext
http://sluggo.scrapping.cc/python/sacontext/


0.4では、特にSession関係の変更が大きいと思います。
SessionContext, DynamicMetaDataがなくなったので、Webアプリケーションで使う場合は、基本的にscoped_sessionを使うことになるでしょう。

from sqlalchemy.orm import scoped_session, sessionmaker

Session = scoped_session(sessionmaker(autoflush=True, transactional=True))
Session.configure(bind=engine)

u = User(name='wendy')

sess = Session()
sess.save(u)
sess.commit()


もしくは、DBの水平分割を実現するSharedSessionというSessionサブクラスを使うのもよさそうです。
/sqlalchemy/trunk/examples/sharding/attribute_shard.py


いずれにせよ、DB接続やSessionの設定の扱いは別のライブラリや拡張に任せたい仕事なので、SAContextがどう出てくるかの対応まちですね。


またassignmapperもdeprecatedになり、Sessionのクラスメソッドmapperを使えということです。

Session.mapper(User, users_table)

u = User(name='wendy')
Session.commit()


トランザクションも、以前はTransactionインスタンスを作ってbegin(), commit(), rollback()を行っていましたが、Sessionに一本化されたようです。

# 0.3までのトランザクションの擬似コード
trans = session_context.current.create_transaction()
trans.begin()
try:
    # セッションを使う
    session_context.current.flush()
except:
    trans.rollback()
else:
    trans.commit()
# 0.4の例
Session = sessionmaker(autoflush=True, transactional=False)

sess = Session()
sess.begin()

# セッションを使う

# コミット
sess.commit() 


0.3をバリバリ使っていた人間には厳しい変更が多いですが、概念的には整理され、分かりやすくなっていると思いますし、実行速度も向上しているようなので、今後もSQLAlchemyに期待です。