我对SQLAlchemy中的会话对象感到困惑。它是否像PHP会话,其中会话是用户的所有事务,或者是会话是一个范围事务生命周期的实体。
对于SQLAlchemy中的每个事务,过程如下: - 创建和打开会话 - 执行交易 - 提交或回滚 - 关闭会话
所以,我的问题是,对于客户端,我们是创建单个会话对象,还是每当我们要执行事务时都会创建会话对象
答案 0 :(得分:3)
我会犹豫是否将SQLAlchemy会话与PHP会话进行比较,因为通常PHP会话引用cookie,而SQLAlchemy根本不涉及cookie或HTTP。
正如the documentation所述:
会话通常在逻辑的开头构建 可能预期数据库访问的操作。
会话,无论何时用于与数据库通信,都会开始 数据库事务一开始通信。假设 autocommit标志保留其建议的默认值False,这个 在会话回滚之前,事务仍在进行中, 承诺或关闭。如果会话,会话将开始新的交易 在前一个交易结束之后再次使用;从 因此,会话能够延长寿命 跨越许多交易,虽然一次只有一个。我们指的是这些 作为事务范围和会话范围的两个概念。
这里的含义是SQLAlchemy ORM正在鼓励 开发人员在他或她的应用程序中建立这两个范围, 不仅包括范围的开始和结束,还包括范围 这些范围的例子,例如,单个Session实例应该是本地的 如果它是一个函数或方法中的执行流程 整个应用程序使用的全局对象,或介于两者之间的某个位置 这两个。
如您所见,完全由应用程序的开发人员决定如何使用会话。在简单的桌面应用程序中,创建单个全局会话对象并继续使用该会话对象可能是有意义的,在用户点击“保存”时提交。在Web应用程序中,经常使用“按请求处理的会话”策略。有时您在同一个应用程序中使用这两种策略(Web请求的每个请求会话,但是后台任务的属性略有不同的单个会话)。
何时使用会话没有“一刀切”的解决方案。 documentation确实提供了关于如何确定这一点的提示。