首页 > 数据库 >关于SQLAlchemy中update的使用参数synchronize_session

关于SQLAlchemy中update的使用参数synchronize_session

时间:2023-06-03 17:34:00浏览次数:67  
标签:SQLAlchemy 更改 数据库 update 更新 synchronize session flush

update语句带上synchronize_session="fetch"或者带上synchronize_session=False是啥区别

在SQLAlchemy中,当您使用update语句更新数据库中的记录时,可以使用`synchronize_session`参数来指定要同步的会话对象。

- 当`synchronize_session`设置为`False`时,会话对象不会自动同步,这意味着您需要手动调用`session.commit()`来提交更改。
- 当`synchronize_session`设置为`fetch`时,会话对象将自动在更新操作完成后刷新所有相关对象的状态。这意味着在更新操作完成后,您可以立即访问已更新的数据。

因此,如果您希望在更新操作完成后立即访问已更新的数据,则应将`synchronize_session`设置为`fetch`。如果您不需要立即访问已更新的数据,则可以将其设置为`False`,并稍后手动提交更改。

但是不论哪个参数,都是要commit了之后才会写进数据库的吧

是的,无论您使用`synchronize_session`参数的哪个选项,都需要在更新操作完成后手动提交更改,即调用`session.commit()`方法,才能将更改写入数据库。`synchronize_session`参数只是控制会话对象何时将更新后的数据刷新到相关对象中,而不是何时将更改写入数据库。

所以synchronize_session=False,然后flush,和fetch是一样的效果对吧

不完全一样。`flush()`方法将在会话对象中缓冲的所有挂起更改写入数据库,但不会将数据库中的数据同步到相关对象中。而`synchronize_session='fetch'`参数将在更新操作完成后自动刷新所有相关对象的状态,这意味着您可以立即访问已更新的数据,而无需手动调用`session.flush()`或`session.commit()`方法。

因此,如果您需要立即访问已更新的数据,则应使用`synchronize_session='fetch'`参数。如果您只需要将更改写入数据库,但不需要立即访问已更新的数据,则可以使用`flush()`方法或将`synchronize_session`参数设置为`False`,并稍后手动提交更改。

那什么都不传,默认是什么

如果您在使用`update()`方法时不传递`synchronize_session`参数,则会使用默认值`'evaluate'`。这意味着会话对象将根据需要自动判断何时同步相关对象的状态。在大多数情况下,这将产生预期的结果,但如果您需要更细粒度地控制何时同步状态,则应显式指定`synchronize_session`参数。

那我的代码中途flush了,之后没有commit就因为别的原因return給请求端了,数据会更新进数据库吗

不会。如果您在调用`flush()`方法后未调用`commit()`方法,并且会话对象未提交更改,则更改不会写入数据库。在这种情况下,如果您的代码在`flush()`方法后返回响应,则更改将被回滚,即不会更新到数据库中。

如果您希望确保更改写入数据库,则应在执行完所有操作后调用`commit()`方法。如果在执行操作期间发生错误,则应捕获异常并回滚会话对象,以避免将部分更改写入数据库。

标签:SQLAlchemy,更改,数据库,update,更新,synchronize,session,flush
From: https://www.cnblogs.com/pywjh/p/17454288.html

相关文章

  • synchronized 关键字
    1.synchronized关键字的作用synchronized关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。2.作用范围修饰代码块:大括号括起来的代码,作用于调用的对象。修饰方法:整个方法,作用于调用的对象。修饰静......
  • teacher_update
    <%--CreatedbyIntelliJIDEA.User:绿波亭Date:2023/5/29Time:14:51TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYP......
  • sqlalchemy.orm.exc.DetachedInstanceError: Instanceis not bound to a Session; att
    在使用sqlalchemy的orm时,在一个循环中,如果一开始select时用了session,中间update某条记录后,session被关闭,就会出现对象notboundtoaSession的问题.DBSession=sessionmaker(bind=self.engine,expire_on_commit=False)这时需要 expire_on_commit=False Themostcommo......
  • es 批量更新 _update_by_query
        {"script":{"source":"ctx._source['owner']=1610"},"query":{"term":{"categoryCId":{"value":807}}}} {"script":{"source":"ctx._source......
  • VMware ESXi 8.0 Update 1a macOS Unlocker & OEM BIOS (标准版和厂商定制版)
    VMwareESXi8.0Update1amacOSUnlocker&OEMBIOS(标准版和厂商定制版)ESXi8.0U1标准版,DellHPE联想浪潮定制版请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u1-oem/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgESXi8.0U1a:此补丁修复了以下......
  • mysql 特有的 重复的主键 更新on duplicate key update
    insertintoharm_behavor_info(id,name,age,hobby,del_status)values(1,'xc','28','跑步',0)onduplicatekeyupdatedel_status=0,age=values(age),hobby=values(hobby)在向mysql中插入数据的时候,如果主键重复了,则执行更新语句。固定字段的值可以直接写,比......
  • docker apt-get update失败问题解决
    一、问题描述docker容器相当于linux系统的精简版,内部很多指令是无法直接使用的,例如vim指令,为了使用vim指令,我们需要进入容器内部进行安装,安装步骤为:apt-getupdateapt-getinstallvim很多时候我们发现安装会失败,这里是由于下载源问题。二、解决方案1.进入宿主机下cd/e......
  • VMware vSphere 8.0 Update 1a 正式版发布 - 企业级工作负载平台
    VMwarevSphere8.0Update1a正式版发布-企业级工作负载平台ESXi8.0U1&vCenterServer8.0U1请访问原文链接:https://sysin.org/blog/vmware-vsphere-8-u1/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2023-06-01,VMwarevSphere8.0U1a发布。ESXi8.0......
  • Spring boot 使用 jpa 动态插入@DynamicInsert和动态更新@DynamicUpdate(动态指部分或
    @DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。@DynamicUpdate属性:设置为tru......
  • 9. 子查询/INSERT/UPDATE/DELETE/REPLACE(未完成)
    一.子查询子查询就是指在一个select语句中嵌套另外一个select语句。同时子查询必须包含括号。MySQL5.6之前,子查询的性能较差,但是从5.6开始,不存在性能差的问题。selectafromt1wherea>any(selectafromt2);1.selectafromt1是外部查询(outerquery)2.(selectafro......