我刚从这个 SQLAlchemy ORM 开始,我想知道,如果在调用会话提交之后,你是否仍然可以使用该 sesison 进行查询,甚至可能再次提交。
所以,例如
session = Session()
session.add(Foo())
session.commit()
print session.query(Foo).first()
session.add(Bar())
session.commit()
所有这些代码都可以工作吗?
我刚从这个 SQLAlchemy ORM 开始,我想知道,如果在调用会话提交之后,你是否仍然可以使用该 sesison 进行查询,甚至可能再次提交。
所以,例如
session = Session()
session.add(Foo())
session.commit()
print session.query(Foo).first()
session.add(Bar())
session.commit()
所有这些代码都可以工作吗?
正如@van 已经指出的那样,答案是肯定的,但是这里是基于sqlalchemy 文档的解释:
当回滚或提交后事务状态完成时(即
session.rollback()或session.commit(),Session 释放所有 Transaction 和 Connection 资源,并回到“开始”状态,再次调用新的 Connection 和 Transaction 对象作为新的请求发出 SQL 语句收到。
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()