了解SqlAlchemy会话的不稳定性有多大?

2024-09-25 00:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,sessionmaker返回一个sessionFactory(在他们所有的文档中,这个函数也被称为Session),你可以用它来创建听起来很像数据库游标的session对象。在

具体来说,session对象是什么?它像db游标一样短暂,还是更重要(例如,会话是否只绑定到引擎连接池中的一个底层连接)?在


Tags: 对象函数文档引擎数据库dbsqlalchemysession
1条回答
网友
1楼 · 发布于 2024-09-25 00:32:36

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

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

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

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

现在让我们检查一下我们的user,以更好地理解会话正在跟踪什么:

^{pr2}$

刷新会话后立即观看:

^{3}$

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

> 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。如果底层引擎/db支持对Session.beginSession.begin_nested的适当调用将创建子事务。在

调用Session.commit和{}在当前活动事务中执行SQL。在

初始化引擎时打开echo=True,并观察由各种会话方法发出的SQL,以更好地了解发生了什么。在

相关问题 更多 >