7

Pylonsユーザーとして、私はPyramidに切り替えて、違いを理解しようとしています。

パイロンでは、セッションをmyproj.model.meta次のように定義するために使用されました。

Session = scoped_session(sessionmaker())

次に、それをインポートしてmyproj.modelモデルを定義し、アプリで以下を参照します。

root = Session.query(MyModel).filter(...)...

Pyramid(pyramid_routesalchemy)でデフォルトのテンプレートを使用するようになりました。以前と同じようにSessionを定義します(呼び出しとDBSession拡張機能の追加を除く)。

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

しかし、views.py私はそれを直接使用しませんが、それをインスタンス化します:

dbsession = DBSession()
root = dbsession.query(MyModel).filter(...)...

なんで?違いは何ですか?


また、ピラミッドとの違いは何ですか

import transaction
...
model = MyModel(name=u'root', value=55)
session.add(model)
session.flush()
transaction.commit()

パイロンへ

model = MyModel(name=u'root', value=55)
session.add(model)
session.commit()
4

2 に答える 2

10

実際、クエリのために sqlalchemy セッション インスタンスを検索する方法は、実際にはパイロンやピラミッドとは何の関係もありません。Pylons は「標準的な」pylons の方法の 1 つを提案したかもしれませんが、それだけです。セッションを取得する方法の唯一の実際の違いは、ZopeTransactionExtension を使用した例です。

ZopeTransactionExtension は、開いているすべてのセッションがアクティブなトランザクションに参加することを確認する小さなピースです。したがって、5 つのセッションを開くと、それらはすべて同じトランザクションに参加します。そうすれば、トランザクションをコミットまたはロールバックすると、5 つのセッションのいずれかによって行われたすべての作業がそれに続きます。トランザクション モジュール ("transaction.commit()") がここで重要です。

pyramid_tm は、トランザクションのセットアップを簡単にしようとします... リクエストの入力時に 1 つを開始し、範囲指定されたすべてのデータベース セッションがそれに参加します... そして、リクエストの最後で、エラーが発見された場合、トランザクションをロールバックします。それ以外の場合、トランザクションはコミットされます。そうすれば、ビューレベルのコードは、トランザクションを手動で作成またはクローズ/コミット/ロールバックする必要がありません。

ほとんどの場合、session.flush() は、トランザクションをコミットせずに、データベース モデルのインスタンスが主キーを確実に取得できるようにするためのものです。

したがって、ビュー内で行う必要があるのは次のとおりです。

def myview(request):
    session = DBsession()
    session.add(model)

pyramid_tm は、セッションが適切にコミットまたはロールバックされていることを確認します。

于 2011-05-18T12:50:48.047 に答える
0

記録として、dbsession.flush() の発行はうまく機能しているようで (セッションがコミットされます)、追加のインポートを処理する必要はありません。

于 2011-08-04T13:37:31.357 に答える