sqlalchemy session

session 是做什么的呢?

在一般的意义上, 会话建立与数据库的所有对话, 并为你在其生命周期中加载或关联的所有对象表示一个“等待区”。他提供了一个入口点获得查询对象, 向数据库发送查询使用会话对象的当前数据库连接, 填充结果行在对象中, 然后存储在会话中, 在这种结构中称为身份映射 – 这种数据结构维护了每一个副本的唯一, 这种唯一意味着一个对象只能有一个特殊的唯一主键。

会话已基本无状态的形式开始。 一旦发出查询或其他对象被持久化, 它就会从一个引擎请求连接资源没, 该引擎要么与会话本身相关联, 要么与正在操作的映射对象相关联。 此连接标识正在进行的事务, 在只是会话提交或回滚其挂起状态之前, 该事务任然有效。

会话中维护的所有变化的对象都会被跟踪 - 在再次查询数据库或提交当前事务之前, 它将刷新对数据库的所有未决更改, 这被称为工作模式单元。

在使用会话时候, 最重要的是要注意与它相关联的对象是会话所持有的事务的代理对象 - 为了保持同步, 有各种各样的时间会导致对象重新访问数据库。 从会话中 分离对象并继续使用他们是可能的。 尽管这种做法尤其局限性。通常, 当你希望再次使用分离的对象时候, 你会将他们与另一个会话重新关联起来, 一遍他们能够恢复表示数据库状态的正常任务。

获得一个session

Session 是一个直接实例化的常规的Python 类。然而, 为了标准会会话的配置和获取方式, sessionmaker 类通常用于创建顶级会话配置, 然后可以在整个应用程序中使用它, 而不是需要重复配置参数。

下面是sessionmaker 的使用方式

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# an Engine, which the Session will use for connection
# resources
some_engine = create_engine('postgresql://scott:tiger@localhost/')

# create a configured "Session" class
Session = sessionmaker(bind=some_engine)

# create a Session
session = Session()

# work with sess
myobject = MyObject('foo', 'bar')
session.add(myobject)
session.commit()

上面sessionmaker 调用为我们创建了一个工厂, 我们将其分配给name会话。 这个工厂在被调用时候, 将还是用我们给工厂的配置参数创建一个新的会话。 在这种情况下, 与通常情况一样, 我们已经将工厂配置为为连接资源指定特定的引擎。

典型的设置是将sessionmaker与引擎关联起来, 这样生成的每个会话将使用这个引擎来获取了;连接资源。 这个关联可以像上面的例子一样, 使用bind参数来建立。

当你编写应用程序时, 请将sessionmaker 工厂放在全局级别。 然后, 应用程序的其余部分可以将此工厂用作新会话实例的源, 并将会话对象如何创造的配置保存在一个位置。

sessionmaker 工厂还可以与其他的助手一起使用, 这些助手通过用户定义的sessionmaker 进行维护。 这些助手中的一些将在“何时构建会话,何时提交会话以及何时关闭会话一节中 讨论。

向现有的sessionmaker() 添加额外的配置

一个常见的场景是在模块导入时候调用, 但是这与sessionmaker 关联的一个或者多个引擎实例的生成还没有进行。 对于这个用例, sessionmaker 构造提供了sessionmaker.configure()方法, 她将在调用构造时候向现有的sessionmaker 添加额外的配置指令。

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

# configure Session class with desired options
Session = sessionmaker()

# later, we create the engine
engine = create_engine('postgresql://...')

# associate it with our custom Session class
Session.configure(bind=engine)

# work with the session
session = Session()

使用备用参数创建特定的会话对象

使用的情况下,应用程序需要创建一个新会话和特殊参数偏离通常是在整个应用程序中使用,如一个会话,绑定到一个备用源的连接,或一个会话,应该有其他参数如expire_on_commit建立不同于大多数应用程序,具体参数可以传递到sessionmaker工厂sessionmaker.call()方法。这些参数将覆盖已经放置的任何配置,例如下面的,其中针对特定连接构造了一个新会话:。

# at the module level, the global sessionmaker,
# bound to a specific Engine
Session = sessionmaker(bind=engine)

# later, some unit of code wants to create a
# Session that is bound to a specific Connection
conn = engine.connect()
session = Session(bind=conn)

将会话与特定连接关联的典型基本原理是维护外部事务的测试夹具—请参阅将会话连接到外部事务(例如测试套件)中的示例。

会话常见问题

至此,许多用户已经对会话产生了疑问。本节介绍了一个迷你FAQ(注意,我们也有一个真正的FAQ),介绍了在使用会话时遇到的最基本的问题

When do I make a sessionmaker?

只有一次,在应用程序的全局作用域中。它应该被视为应用程序配置的一部分。如果您的应用程序在一个包中有三个.py文件,例

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值