SQLAlchemy を初めて 使用するSession()
ので、いつビューと呼ばれるべきか疑問に思っていました。グローバル変数として定義するか、リクエストごとに新しいセッションを作成する必要があります。
2 に答える
PyramidSQLAlchemyチュートリアルに従うことを強くお勧めします。シンプルなウィキアプリケーションでPyramidでSQLAlchemyを使用する方法を説明します。
チュートリアルでは、アイテムmodels.py
を定義するモジュールが作成されていることに注意してください。DBSession
これにより、SQLAlchemyセッションにアクセスでき、Pyramidスレッドにスコープされ、Pyramidトランザクションモデルに関連付けられ、セッションが必要なときにいつでもインポートされます。
from pyramid.view import view_config
from .models import (
DBSession,
MyModel,
)
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
one = DBSession.query(MyModel).filter(MyModel.name=='one').first()
return {'one':one, 'project':'tutorial'}
DBSessionではmodels.py
、変数は次のように定義されています。
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
ZopeTransactionExtension
;に注意してください Pyramidは、リクエストごとに新しいトランザクションを自動的に開始し、成功した応答でそれをコミットし、例外が発生したときにそれを中止します。これにより、ほとんどのトランザクション処理の義務が軽減されます。.flush
データベースの更新(主キーの自動インクリメントなど)を確認する必要がある場合は、セッションを覚えておいてください。
繰り返しになりますが、チュートリアルはこれ以上のことを拡張しています。
実際、sqlalchemyのドキュメントをさらに読んだ後、私の質問に対する正しい答えを見つけました。ここでは、リクエストごとに新しいコンテキストセッションを作成する必要があります。http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#lifespan-of-a-contextual-sessionを参照してください