7

永続層と通信するためのdaoオブジェクトを作成するために、その表記法と接続プールにsqlalchemy式言語を使用しています。アプリケーションビューの呼び出し可能オブジェクトで使用できるように、メタデータとエンジンの設定にどのように取り組むべきかについて、いくつかの意見を聞きたいと思いました。sqlalchemyのドキュメントhttp://docs.sqlalchemy.org/en/rel_0_7/core/connections.htmlによると、これらは通常、バインドされてグローバルとして宣言されていますが、これもシングルトンアプローチも良いアイデアではありません。どんな考えでもいただければ幸いです...

これは__init__.py私のプロジェクトのディレクトリ内の私のファイルがどのように見えるかです:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config, MetaData, create_engine
from pyramid_beaker import session_factory_from_settings

db_url = 'postgresql://user:password@localhost/dbname'
engine = create_engine(db_url)
meta = MetaData()

def main(global_config, **settings):
    meta.bind = engine
    .
    .
    .
    [other configuration settings]
4

2 に答える 2

5

Pyramidのドキュメントには、PyramidとSQLAlchemyの統合に関するチュートリアルが含まれています。

pyramid_tmSQLAlchemyトランザクションとセッション管理をPyramidと統合する2つの特別なパッケージがありますzope.sqlalchemy。これらは一緒にあなたのセッションの世話をします:

from sqlalchemy import engine_from_config

from .models import DBSession

def main(global_config, **settings):
    """This function returns a Pyramid WSGI application."""

    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    # Configuration setup

.iniここでは、構成ファイルから構成設定を取得します。とでmodels.py

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

class YourModel(Base):
    # Define your model

そこの使用に注意してくださいscoped_session。トランザクション拡張機能を使用してPyramidと統合します。

次に、ビューで行う必要があるのは、DBSessionセッションファクトリを使用してセッションを取得することだけです。

from pyramid.view import view_config
from .models import (
    DBSession,
    YourModel,
    )

@view_config(...)
def aview(request):
    result = DBSession.query(YourModel).filter(...).first()

コミットとロールバックはリクエストと統合されます。たとえば、2xxと3xxでコミットし、例外でロールバックします。

于 2012-08-11T07:51:15.457 に答える
3

sqlalchemyのドキュメントの例では、簡潔にするためにグローバルであると宣言しており、推奨していることを示しているわけではないと思います。

アプリケーションのさまざまな部分に本当に渡したいのは、Sessionオブジェクトだけだと思います。より単純なオプションは、スコープセッションを使用することです(O'Reilly sqlalchemyの本は、実際には、より単純なWebベースのアプリケーションに推奨されています。コードはそれがWebアプリであることを示唆しています)。データベース接続をインスタンス化するとき以外の場所でエンジンまたはメタデータを必要とするアプリケーションはほとんどないと思います。

スコープセッションは、アプリの起動時にエンジンとメタデータが作成されるときにも作成されます(ピラミッドの場合、ここのメイン関数で)。次に、データベースへのアクセスが必要なアプリケーションのさまざまな部分にパラメーターとして渡します。

于 2012-08-11T07:41:15.750 に答える