了解SqlAlchemy会话 - 它们有多易变?

时间:2014-09-17 08:54:20

标签: python session sqlalchemy

我正在尝试使用SqlAlchemy,并试图掌握如何处理连接对象。

因此sessionmaker会在其所有文档中返回sessionFactory(令人困惑的称为Session),并使用它来创建session对我来说听起来很像数据库光标的对象。

具体是什么session对象?它是否像db游标一样短暂,或者它是否更具实质性(例如,会话是否专门绑定到引擎连接池中的一个底层连接)?

1 个答案:

答案 0 :(得分:3)

Session对象不是数据库游标;使用Session时,您可以打开和关闭任意数量的单个游标。在单个会话的生命周期内,您可以插入一些记录,运行查询,发布更新和删除。

会话的常见问题解答topic is addressed;简而言之,Session是一个实现identity map pattern的内存中对象,它将在提交时将应用程序中存在的对象状态与数据库同步。

# User here is some SQLAlchemy model
user = session.query(User).filter(User.name == 'John').one()
user.name = 'John Smith' 

在此阶段,数据库仍然认为该用户的名字是John。它将一直持续到会话被刷新或提交为止。请注意,在大多数配置下,您从会话中运行的任何查询都会自动刷新会话,因此您不必担心这一点。

现在让我们检查一下user,以便更好地了解会话跟踪的内容:

> from sqlalchemy import orm
> orm.attributes.get_history(user, 'name')
History(added=['John Smith'], unchanged=(), deleted=['John'])

一旦我们刷新会话,请注意:

> session.flush()
> orm.attributes.get_history(user, 'name')
History(added=(), unchanged=['John Smith'], deleted=())

但是,如果我们不提交会话而是将其回滚,我们的更改将不会坚持:

> session.rollback()
> orm.attributes.get_history(user, 'name')
History(added=(), unchanged=['John'], deleted=())

Session对象是底层连接和事务对象的公共API。要了解SQLAlchemy中连接和事务的工作方式,请查看core documentation's section on the topic

更新:会话持久性

会话保持开放,直到通过Session.close()明确关闭。通常,事务管理器会在Web应用程序实现中自动为您处理此问题,但是,例如,无法关闭您在测试套件中打开的会话可能会因许多打开的事务而导致问题。

会话完全用Python保存您的更改,直到通过Session.flush()刷新,或者如果启动了autoflush,则运行查询。刷新后,会话将在事务中向数据库发出SQL。重复刷新只会在该事务中发出更多SQL。如果底层引擎/数据库支持,则对Session.beginSession.begin_nested的适当调用可以创建子事务。

调用Session.commitSession.rollback在当前活动的事务中执行SQL。

初始化引擎时打开echo=True并观察各种Session方法发出的SQL,以便更好地了解发生的情况。