You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyMySQL中INSERT语句如何正确使用占位符及插入NULL数据?

问题解决方案

修正后的代码

resultValues = ['2022-11-14 00:00:00', 1018, '247 Voice', 18, 81, 93, 1, 9, 'Workload was significantly above expectations, with a 100% increase.', 0, 1, 0, 1, 0, None, None, None, '2022-12-01 14:19:45', 1]
# 生成与元素数量匹配的占位符
placeholders = ', '.join(['%s'] * len(resultValues))
sql3 = f"""INSERT INTO poi_template_text_locale (Time_Interval, QueueID, NameStr, TemplateID, SectionID, ContentSection, PageSection, LineNum, Sentence, Graph1ID, Graph1Placement, Graph2ID, Graph2Placement, TableID, TablePlacement, Graph1Text, Graph2Text, TSTIMESTAMP, LocaleID) VALUES ({placeholders});"""
cursor.execute(sql3, resultValues)  # 直接将列表作为参数传入execute
connection.commit()

疑问解答

  • 占位符使用:必须为每个字段对应一个%s,不能只用单个占位符。PyMySQL的execute方法会自动将参数列表的每个元素匹配到对应占位符,同时处理数据类型转换和SQL注入防护。
  • 列表vs元组:两者都可以作为execute的参数,没有本质区别,PyMySQL均能正常处理。
  • 插入NULL:直接用Python的None即可,PyMySQL会自动将其转换为SQL中的NULL。之前报错是因为你用了字符串格式化(sql3 % (...))而非execute的参数传递机制,导致None被错误转成字符串'None',触发语法错误。

错误原因分析

  1. TypeError: not all arguments converted during string formatting:仅用了1个%s占位符,却传入包含19个元素的元组,字符串格式化无法匹配数量,导致报错。
  2. ProgrammingError:移除tuple后直接用列表做字符串格式化,列表被转成Python字符串格式(如['xxx', 'yyy']),不符合SQL语法规范,引发数据库报错。

内容的提问来源于stack exchange,提问作者Jack Coleman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:42:13