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

Session.removeを呼ぶタイミング

SQLAlchemy Django

DjangoでSQLAlchemyについては以前書きましたが、その時の内容から、今は、signals.request_finishedではなく、signals.request_startedをキャッチするようにした方がいいのではと思っています。

from django.core import signals
from django.dispatch import dispatcher

def start_request(signal, sender):
    # SQLAlchemyのContextual Sessionを初期化する
    Session.remove()

dispatcher.connect(receiver=start_request,
                   signal=signals.request_started)


理由は何らかの拍子にSession.remove()が呼ばれず、したがって接続プールのリサイクル期間がすぎた接続を渡された場合に、Webアプリケーション側の処理が死んでしまうから。


http://www.sqlalchemy.org/docs/04/session.html#unitofwork_contextual_lifespan:SQLAlchemyのドキュメントにはリクエストの最後に初期化するように書いてあります。これが僕がSQLAlchemy0.4に移行するとき、もともとrequest_startedのイベントハンドラの中でSession.remove()相当の処理をやっていたのに、request_finishdedのイベントハンドラに処理を移した理由です。


開発版は上のようなコードに変えて、ひとまず様子を見ようと思っています。
あと、Unicode Branch + Auto Escaping(trunk head revision)に移行しました!!!!!