Python 了解SqlAlchemy会话-它们有多不稳定?

Python 了解SqlAlchemy会话-它们有多不稳定?,python,session,sqlalchemy,Python,Session,Sqlalchemy,我正在试验SqlAlchemy,并试图掌握如何处理连接对象 因此,sessionmaker返回一个sessionFactory(在它们的所有文档中也被称为Session),您可以使用它来创建Session对象,我觉得它听起来很像数据库游标 具体来说,什么是会话对象?它是像db游标一样短暂,还是更重要(例如,会话是否专门绑定到引擎连接池中的一个底层连接)?会话对象不是数据库游标;使用会话时,您可以打开和关闭任意数量的单个游标。在单个会话的生命周期内,您可以插入一些记录、运行查询、发布更新和删除 会

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

因此,
sessionmaker
返回一个
sessionFactory
(在它们的所有文档中也被称为
Session
),您可以使用它来创建
Session
对象,我觉得它听起来很像数据库游标


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

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

会议上有一个常见问题解答,其中:;简言之,会话是一个内存中的对象,它实现了一个在提交时将应用程序中存在的对象的状态与数据库同步的会话

# User here is some SQLAlchemy model
user = session.query(User).filter(User.name == 'John').one()
user.name = 'John Smith' 
在这个阶段,数据库仍然认为这个用户的名字是John。它将继续运行,直到刷新或提交会话为止。请注意,在大多数配置下,从会话运行的任何查询都会自动刷新会话,因此您无需担心这一点

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

> 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=())
会话对象是底层连接和事务对象的公共API。要了解SQLAlchemy中的连接和事务是如何工作的,请查看

更新:会话持久性

会话保持打开状态,直到通过
Session.close()
显式关闭。通常,事务管理器会在web应用程序实现中自动为您处理此问题,但是,例如,未能关闭您在测试套件中打开的会话可能会由于许多打开的事务而导致问题

会话完全用Python保存您的更改,直到通过
Session.flush()
刷新为止,或者如果启用了自动刷新,则在运行查询时刷新。刷新后,会话将在事务中向数据库发出SQL。重复刷新只会在该事务中发出更多SQL。对
会话.begin
会话.begin\u嵌套
的适当调用可以创建子事务,前提是基础引擎/db支持它

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


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

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

会议上有一个常见问题解答,其中:;简言之,会话是一个内存中的对象,它实现了一个在提交时将应用程序中存在的对象的状态与数据库同步的会话

# User here is some SQLAlchemy model
user = session.query(User).filter(User.name == 'John').one()
user.name = 'John Smith' 
在这个阶段,数据库仍然认为这个用户的名字是John。它将继续运行,直到刷新或提交会话为止。请注意,在大多数配置下,从会话运行的任何查询都会自动刷新会话,因此您无需担心这一点

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

> 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=())
会话对象是底层连接和事务对象的公共API。要了解SQLAlchemy中的连接和事务是如何工作的,请查看

更新:会话持久性

会话保持打开状态,直到通过
Session.close()
显式关闭。通常,事务管理器会在web应用程序实现中自动为您处理此问题,但是,例如,未能关闭您在测试套件中打开的会话可能会由于许多打开的事务而导致问题

会话完全用Python保存您的更改,直到通过
Session.flush()
刷新为止,或者如果启用了自动刷新,则在运行查询时刷新。刷新后,会话将在事务中向数据库发出SQL。重复刷新只会在该事务中发出更多SQL。对
会话.begin
会话.begin\u嵌套
的适当调用可以创建子事务,前提是基础引擎/db支持它

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


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

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

会议上有一个常见问题解答,其中:;简言之,会话是一个内存中的对象,它实现了一个在提交时将应用程序中存在的对象的状态与数据库同步的会话

# User here is some SQLAlchemy model
user = session.query(User).filter(User.name == 'John').one()
user.name = 'John Smith' 
在这个阶段,数据库仍然认为这个用户的名字是John。它将继续运行,直到刷新或提交会话为止。请注意,在大多数配置下,从会话运行的任何查询都会自动刷新会话,因此您无需担心这一点

现在,让我们检查一下我们的
用户
,以便更好地