SQLAlchemy:提交后会话查询是否仍然有效?

时间:2012-06-29 01:46:58

标签: sqlalchemy

我刚开始使用这个SQLAlchemy ORM,我想知道,如果在调用会话提交后,如果你仍然可以使用该sesison进行查询,甚至可能再次提交。

所以,例如

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

所有这些代码都有用吗?

3 个答案:

答案 0 :(得分:8)

简短回答:是。
答案很长:请阅读Using the Session以及Managing Transactions部分。

答案 1 :(得分:2)

@van已经指出答案是,但这是基于sqlalchemy documentation的说明:

当回滚或提交后事务状态完成时(即session.rollback()session.commit(),会话将释放所有事务和连接资源,并返回到“开始”状态,这将再次收到新的发出SQL语句的请求时,调用新的Connection和Transaction对象。

答案 2 :(得分: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()