sqlalchymy expire_on_commit

2024-06-17 04:44
文章标签 commit expire sqlalchymy

本文主要是介绍sqlalchymy expire_on_commit,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 SQLAlchemy 中,expire_on_commit 是一个会话(Session)级别的选项,它决定了在事务提交后,会话中的对象是否应该被标记为“过期”(expired)。当一个对象被标记为过期时,它的所有属性都会被视为与数据库中的实际状态不同步,因此在下次访问这些属性时,SQLAlchemy 会从数据库中重新加载这些属性的值。

默认情况下,expire_on_commit 的值为 True,这意味着在事务提交后,会话中的所有对象都会被标记为过期。这种行为可以确保在读取数据之后,如果其他事务修改了数据,那么再次读取这些数据时会从数据库中获取最新的值。

然而,在某些情况下,你可能希望会话中的对象在事务提交后仍然保持与数据库同步的状态,即使其他事务修改了数据。在这种情况下,你可以将 expire_on_commit 设置为 False。这样,在事务提交后,会话中的对象将不会被标记为过期,你可以继续访问它们的属性而无需从数据库中重新加载。

需要注意的是,即使将 expire_on_commit 设置为 False,也不意味着你可以安全地忽略其他事务对数据的修改。如果你在一个长时间运行的会话中访问数据,并且在此期间有其他事务修改了这些数据,那么这些修改可能不会反映在你的会话中,从而导致数据不一致。因此,在需要确保数据一致性的情况下,最好将 expire_on_commit 设置为 True,并在每次访问数据之前都重新加载它。

以下是一个示例,演示如何在使用 SQLAlchemy 时设置 expire_on_commit

from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import sessionmaker, scoped_session# 创建引擎和会话工厂
engine = create_engine('your_database_uri')
Session = scoped_session(sessionmaker(bind=engine, expire_on_commit=False))  # 设置为 False# 假设你有一个名为 "users" 的表
metadata = MetaData()
users = Table('users', metadata, autoload_with=engine)# 创建一个会话并执行一些操作
session = Session()
# ... 执行一些数据库操作 ...# 提交事务(但对象不会过期)
session.commit()# 你可以继续访问会话中的对象,而无需重新加载它们(但请注意数据一致性问题)

这篇关于sqlalchymy expire_on_commit的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068505

相关文章

git commit -a

今天提交git时遇到这样一个问题,我在项目里rm掉了许多文件,等到想commit的时候,发现这些被删除的文件都是not staged的状态,这要一个个的去git rm就太蛋疼了。这时候就发现了git commit -a这个命令。 OPTIONS-a, --allTell the command to automatically stage files that have been modif

git查看、修改、删除属性,配置提交commit用户名和邮箱

1. 查看 查看所有 git config --list git config --worktree --list git config --local --list git config --global --list git config --system --list 2. 设置 git config --local user.n

git commit -am

当修改已经通过git add <change file>将其添加到stage,可以通过git commit -m "<message>"为这所有已经进入stage的改变添加一个commit信息。什么是在stage中?看下面 如果你的文件之前已经提交过,但这次的改动还没有进stage,如下: 可以直接使用git commit -am "<message>",将所有修改,但未进s

Mysql中的隐式COMMIT以及Savepoints的作用以及MySQL的Innodb分空间存储、设计优化、索引等几个小知识点整理

一、Mysql中的隐式COMMIT以及Savepoints的作用     Mysql默认是自动提交的,如果要开启使用事务,首先要关闭自动提交后START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务。但即使如此,也并不是所有的操作都能被ROLLBACK,以下语句在执行后会导致回滚失效,比如DDL语句创建一个数据库,而且不止此,这样的语

Oracle 忘了commit

今天在插入数据的时候忘了写commit. 导致后面的插入任务等了好久。

incr命令和expire命令的误区--举例每分钟访问次数限制

要实现的功能:限制用户的每分钟的访问次数 一个有严重bug的代码:每次访问来了,就执行代码块二,当第一次访问,就走else语句,设置当前用户的次数为1,且设置该key的有效期是一分钟。 在一分钟之内,第二次来访问了,就走if语句了,因为redis存在这个key了,就实现自增一,然后取出来判断是否超过了设定的阈值。逻辑上看似看似没什么问题。 代码块一: Long maxAllowedTimes

git命令之add,commit,push

参考http://www.zhanglian2010.cn/2014/07/git-pull-vs-fetch-and-merge/ git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我

git合并dev分支的多个commit到master分支

这里主要使用新建指定位置分支,rebase,以及删除新建分支,三步操作进行 1.新建到合并的commit处的branch git checkout -b newbranch 74b73d6a 后面跟得的是commit_id,这个commit是最后需要合并到的那个[ , commit_id] 2.rebase到master git checkout mastergit rebase ne

2pc_two phase commit详情

文章目录 1. two phase commit protocol1.假设前提2. 算法概述3. 缺点4. 详情1. coordinator 端来看2. cohorts端 5. 正确性分析6. 简单总结 看2pc和3pc看的晕晕乎乎的,看了很多博客,感觉说的都不够细致,看起来也容易犯晕,找到了两篇英文文档(不算原文),看起来好像是清楚一些,有些时候这些协议类的东西研读,如果不是

git commit的一些操作

git-commit   软件版本:   操作系统:ubuntu10.04     内核版本:Linux version 2.6.32-36-generic     git 版本:git version 1.7.0.4 目录:   1. 文件状态   2. 提交     2.1 git commit 与 git commit -a     2.2 添加提交信息   3. 修改/取