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',触发语法错误。
错误原因分析
TypeError: not all arguments converted during string formatting:仅用了1个%s占位符,却传入包含19个元素的元组,字符串格式化无法匹配数量,导致报错。ProgrammingError:移除tuple后直接用列表做字符串格式化,列表被转成Python字符串格式(如['xxx', 'yyy']),不符合SQL语法规范,引发数据库报错。
内容的提问来源于stack exchange,提问作者Jack Coleman
相关产品推荐
相关产品推荐

