0
# I've set echo=True when doing create_engine, so I can see all the sql stmt
# DBSession is ScopeSession(thread_local) and autocommit is False
session = DBSession() 
session.add(somemodel)
# 
try:
    session.flush()
    raise Exception()
    session.commit()
except SQLAlchemyError as e:
    session.rollback()
finally:
    session.close()

SQLAlchemy docs によると:

The close() method issues a expunge_all(), and releases any transactional/connection
resources. When connections are returned to the connection pool, transactional state is
rolled back as well.

「session.close()」を実行すると、ログ「ロールバック」が表示されることを期待しています

4

1 に答える 1

4

プールで発生するロールバック (構成されている場合はコミット) は、エンジンがコミット/ロールバック イベントに対して通常行うロギングに現在参加していません。

チケット: http://www.sqlalchemy.org/trac/ticket/2752が追加されました。

編集:これを見て、このロギングはエンジンではなくプールのロガーの一部である必要があると思います。そうしないと、これがたくさん得られます:

sqlalchemy.Engine: COMMIT
sqlalchemy.Engine: ROLLBACK (via pool)

を使用している場合は、操作の直前にorSessionを呼び出す必要があるため、アプリケーションはプールのロールバックについてあまり心配する必要はありません。commit()rollback()close()

プールのログ記録は、または名前空間create_engine("url", echo_pool='debug')でログ記録を設定することによって、通常はオンになっています。sqlalchemy.pool

于 2013-06-09T19:30:04.843 に答える