首页 > 数据库 >BUG: pymysql executemany不支持insert on duplicate key update

BUG: pymysql executemany不支持insert on duplicate key update

时间:2024-09-11 17:37:13浏览次数:8  
标签:insert executemany update pymysql duplicate key

pymysql的executemany()方法支持传入单个SQL和一个sequence of records(sequence or mapping)来同时写入多条数据。

例如:

sql = "insert into t(c1, c2) values(%s, %s)"
args = [(1, 2), (3, 4)]
cursor.executemany(sql, args)
# If args is a list or tuple, %s can be used as a placeholder in the query.  
# If args is a dict, %(name)s can be used as a placeholder in the query.

这样可以同时将(1,2) (3,4)两条记录写入数据库,至于性能取决于executemany自身的实现,并不是说一定比多次execute()快,只能说有利于代码简化。

查看了下executemany的代码发现,executemany只对insert/replace语句有加速效果,只有这两种语句pymysql会一次性拼接完成发至mysql server端,其他语句依然是循环调用execute()。

executemany的问题:

经实测发现,pymysql的executemany 不支持insert into ... on duplicate key update ...语句, 而sqlalchemy支持。

当在pymysql executemany()中使用insert into ... on duplicate key update ...语句时,需要双倍的参数,例如:

cursor.executemany("insert into t(c1, c2) values(%s, %s) on duplicate key update c1=%s, c2=%s", [(1, 2)*2, (3, 4)*2])

按常规思维来看,我们已为每条记录的写入提供了全部需要的4个参数,sql应该可以正确被渲染、执行,但实测executemany()会报占位符渲染失败相关的错误:TypeError: not all arguments converted during string formatting

而我们使用execute()语句测试一切正常:

cursor.execute("insert into t(c1, c2) values(%s, %s) on duplicate key update c1=%s, c2=%s", (1, 2)*2)

查看executemany的代码可以发现,executemany仅对insert/replace语句有加速效果,这是因为针对这两种语句pymysql做了集体拼接,减少了多次执行的round-trip耗时,然而在集体拼接过程中,解析sql的正则表达式并没有去解析on duplicate key update之后的占位符,这导致这部分占位符无法被渲染。

替代之路有两条:

  1. 使用execute语句,pymysql的execute()经实测可以为insert into ... on duplicate key update ...语句正确渲染双倍参数。
  2. 使用mysql VALUES()函数可以在update字句中引用insert阶段的值:
cursor.executemany("insert into t(c1, c2) values(%s, %s) on duplicate key update c1=Values(c1), c2=Values(c2)", [(1, 2), (3, 4)])

我们只需要传输一遍字段值即可。

相关issue: New executemany() implementation supporting UPDATE query #506

PSs: 截止2024.9.11 最新的v1.1.1版本此问题依旧。

标签:insert,executemany,update,pymysql,duplicate,key
From: https://www.cnblogs.com/realcp1018/p/18408604

相关文章

  • select...for update 到底是加了行锁,还是表锁?
    原文:select...forupdate到底是加了行锁,还是表锁?前言select...forupdate在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住。1.要什么要用行锁?假如现在有这样一种业务场景:用户A给你转账了2000元,用户B给你转账了3000......
  • MySQL数据库insert,delete,update,select语句
    MySQL数据库insert,delete,update,select语句是在做数据处理是的重要部分首先我们要先拥有一个表格,这里我建立了一个student表然后在这个表格中添加一些数据这里要使用insert的语句INSERTINTOstudent(NO,NAME,age)VALUES(1001,'张三',20);这里我创建到的表有三个属性......
  • Eclipse Check For Updates总是检查不到更新-解决方法
    最近想用流行的JavaIDE——Eclipse的Help->CheckForUpdates更新Eclipse,结果总是说未找到更新:1.检查是否有更新首先,访问Eclipse下载地址获得最新版本(目前为2020-06):再看看系统中的Eclipse版本(Help->AboutEclipseIDE):如果网上版本和当前版本相等(像图中),那就System.......
  • INSERT ... ON DUPLICATE KEY UPDATE 问题记录
    起因:需要新增复制数据并更新原数据状态,故采用INSERT...ONDUPLICATEKEYUPDATE的方式来插入和更新数据问题:数据插入及更新异常环境:MySQL5.7.32数据表结构:点击查看代码CREATETABLE`example_table`(`col_a`varchar(255)NOTNULL,`col_b`varchar(255)NOTN......
  • 【题库】——文字处理软件 附append,substr,insert,find函数
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ intn,opt,l,r; strings,a; cin>>n>>s; while(n--) { cin>>opt; if(opt==1) { cin>>a; s.append(a); cout<<s<<endl; } elseif(opt==2) {......
  • MySQL insert sql 返回自增id
    xml<insertid="addMain"useGeneratedKeys="true"keyColumn="id"keyProperty="id"parameterType="com.hopedove.coreserver.vo.vpm.ForeignTradeOutboundOrderVO">insertintoaps_foreign_trade_ex......
  • 微信小程序 - 云开发报错 errCode: -1 | errMsg: query.update is only available in
    前言关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。在微信小程序开发中,云开发使用云函数update操作数据库时出现报错:thirdScriptErrorerrCode:-1|errMsg:query.updateisonlyavailableinserverSDK/API;at“pages/x”pagelifeCycleMe......
  • GreatSQL执行Update失败案例分析
    GreatSQL执行Update失败案例分析一问题概述业务反馈在应用核心库的用户基本信息表执行部分update命令失败,报错如下:updatexxx.xxx_staffbasicinfosetstaffidstatus='04’wherestaffidin(select*fromduyuanyu.tmp_d_xiaoyuan)>1265Datatruncatedforcolumn......
  • 【Oracle点滴积累】Oracle 19c安装Critical Patch Update for January 2024
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享如何为Oracle19c(未启用RMAN的单实例)安装CriticalPatchUpdate(PatchNumber:35943157),本指引不包含RollBack部分,本文仅供参考,谢谢!cd/home/oracle/NewVersion_Opatch/OPatch/./opatchversio......
  • Windows Server 2019 OVF, updated Aug 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedAug2024(sysin)-VMware虚拟机模板2024年8月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/,查看最新版。原创作品,转载请保留出处。现在都是自动sysprep的......