12

私はこのSQLAlchemyORMを始めたばかりで、セッションへのコミットを呼び出した後でも、そのセッションを使用してクエリを実行したり、別の機会にコミットしたりできるかどうか疑問に思っていました。

だから、例えば

session = Session()
session.add(Foo())
session.commit()
print session.query(Foo).first()
session.add(Bar())
session.commit()

このコードはすべて機能しますか?

4

3 に答える 3

10

簡単な答え:はい。
長い答え:セッションの使用とその一部であるトランザクションの管理をお読みください。

于 2012-06-29T08:49:38.943 に答える
2

@vanがすでに指摘しているように、答えは「はい」ですが、 sqlalchemyのドキュメントに基づいた説明があります。

ロールバックまたはコミット後にトランザクション状態が完了すると(つまりsession.rollback()、またはsession.commit()、セッションはすべてのトランザクションおよび接続リソースを解放し、「開始」状態に戻ります。これにより、SQLステートメントを発行するための新しい要求として新しい接続およびトランザクションオブジェクトが再び呼び出されます。受信します。

于 2020-01-23T12:31:41.387 に答える
0
def test_multi_commit(flask_app):
    session = flask_app.Session()
    try:
        foo = Foo()
        foo.id = 1
        foo.name = 'name'
        session.add(foo)
        session.flush()
        session.begin_nested()
        try:
            foo_obj = session.query(Foo).filter(Foo.id==1).first()
            foo_obj.name = 'i am change'
            # 1/0
            session.commit()
        except Exception as e:
            print(e)
            session.rollback()
            raise
        # this will raise an exception and rollback all the change
        1/0
        session.commit()
    except Exception as e:
        flask_app.logger.info(e)
        print(e)
        session.rollback()
于 2020-03-23T09:17:01.257 に答える