2017-10-18 9 views
1

たとえば、次の2つの違いがありますか?SQLAlchemy ORMセッションをクローズするとコミットされていない変更がロールバックされますか?

session = Session() # Session is a session maker 
try: 
    # do some work 
    session.commit() 
except: 
    session.rollback() 
finally: 
    session.close() 

session = Session() 
try: 
    # do some work 
    session.commit() 
finally: 
    session.close() 

私は(エラーの場合)コミットする前にセッションを閉じ想定しているため、後者は、私が行うために使用するものであるロールバックするのと同じ効果を持っていました。しかし、私は最初のフォームhereを見た。

+0

関連:https://stackoverflow.com/questions/17008441/why-do-sqlalchemy-session-close-not-log-rollback –

答えて

3

Closingセッションは、暗黙的に現在のトランザクションの状態をロールバックします:

close()方法はexpunge_all()、およびreleases任意のトランザクション/接続リソースを発行します。接続プールに接続が戻されると、トランザクション状態もロールバックされます。

しかし、私は最初の形式はまだexplicit is better than implicitより優れていると主張したいと思います。 SQLAlchemyの作成者もseems to reflect this sentimentです。

+0

明示的には常に暗黙よりも優れています:) –

関連する問題