尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

pymysql cursor.execute() 执行 insert into 插入 MySQL 的坑与解决方法:TaoToken 统一 Key 通道下的排查配置骨架

发布时间:2026/9/28 18:08:48

资讯中心
01
ARTICLE

pymysql cursor.execute() 执行 insert into 插入 MySQL 的坑与解决方法:TaoToken 统一 Key 通道下的排查配置骨架

pymysql cursor.execute() 执行 insert into 插入 MySQL 的坑与解决方法:TaoToken 统一 Key 通道下的排查配置骨架
1. 为什么cursor.execute()写 insert 总出幺蛾子如果你用 Python 往 MySQL 写数据大概率绕不开pymysql。它轻、纯 Python、装完就能连库很多后端脚本、数据同步任务、定时入库逻辑都靠它。但真正写起来你会发现cursor.execute()执行insert into的时候坑比想象中多明明 SQL 在客户端里跑得好好的搬到代码里就报You have an error in your SQL syntax数据看着插进去了程序一退出又没了中文变成问号想拿自增主键却拿到 0。这篇就聚焦这些具体问题面向写库场景把占位符、事务提交、字符集、自增主键回填这几件事一次讲清楚。同时给出一套可复制的配置骨架配合 TaoToken 统一 Key 通道来管理模型调用与排查辅助让整个链路更可控。适合正在写 Python 后端、做数据入库、或者被 pymysql 语法错误卡住的同学。核心检索词先摆出来pymysql、cursor.execute()、insert into、mysql、数据库。下面按“问题场景 → 前置配置 → 可复制代码 → 验证动作 → 排错清单”的顺序展开每一步都能直接跟做。2. 先搞懂 pymysql 写库的四个高频坑2.1 占位符用错%s加引号反而报语法错最常见的错误写法是这样sql insert into City(city_name) values %s % item[city_name] cursor.execute(sql)看起来没毛病但字符串拼接会把值直接塞进 SQL一旦值里有单引号、反斜杠SQL 结构就被破坏报You have an error in your SQL syntax。正确做法是用参数化占位符让 pymysql 自己处理转义sql insert into City(city_name) values (%s) cursor.execute(sql, (item[city_name],))注意两点占位符是%s不要加引号参数用元组传单值也要带逗号。这是 pymysql 和很多 ORM 不一样的地方%s对字符串和数字都通用。2.2 事务没提交数据“插了又没插”pymysql 默认autocommitFalse也就是说execute()之后数据只在当前事务里不commit()就不会真正落库。很多人调试时用同一个连接查得到换个连接就查不到就是这个问题。cursor.execute(sql, params) conn.commit() # 少了这行数据随时可能丢如果中途出错记得rollback()否则连接可能一直挂着未提交事务。2.3 字符集不匹配中文变问号或报编码错连接时charset没设对中文入库就变???。建库建表时字符集也要统一推荐utf8mb4能存 emoji 和生僻字。conn pymysql.connect( host127.0.0.1, port3306, userapp, password***, databaseboss, charsetutf8mb4 )2.4 自增主键拿不到lastrowid用错时机插入后想拿自增 ID用cursor.lastrowid但必须在execute()之后、同一个 cursor 上取且要在commit()前后都有效同一连接内。如果用了executemany()lastrowid只返回第一条的 ID这点要特别注意。cursor.execute(sql, params) new_id cursor.lastrowid conn.commit()3. TaoToken 统一 Key 通道的前置配置写库排查过程中经常需要让模型帮忙看报错、生成校验 SQL、或者写一段数据核对脚本。如果每个工具都单独配 Key管理起来很乱。TaoToken 提供统一 Key 通道把模型调用收敛到一个入口配置一次到处能用。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址不带 UTMhttps://taotoken.net/api先拿到 Key再按下面骨架配置。模型对话入口适合临时验证 SQL 和报错https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite3.1 settings.json 骨架编辑器/插件侧{ taotoken: { api_base: https://taotoken.net/api, api_key: sk-你的统一Key, default_model: claude-sonnet, timeout: 60 }, project: { db: { host: 127.0.0.1, port: 3306, user: app, database: boss, charset: utf8mb4 } } }3.2 config.toml 骨架Python 服务侧[taotoken] api_base https://taotoken.net/api api_key sk-你的统一Key default_model claude-sonnet timeout 60 [mysql] host 127.0.0.1 port 3306 user app password *** database boss charset utf8mb4 autocommit false注意Key 不要硬编码进业务代码放环境变量或配置文件并加进.gitignore。TaoToken 的 Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite4. 可复制的 pymysql 写库完整代码下面这段是能直接跑的骨架把连接、参数化插入、事务、主键回填、异常回滚都串起来了。import pymysql from pymysql.cursors import DictCursor def get_conn(): return pymysql.connect( host127.0.0.1, port3306, userapp, password***, databaseboss, charsetutf8mb4, cursorclassDictCursor, autocommitFalse, ) def insert_city(conn, city_name): sql insert into boss.City(city_name) values (%s) with conn.cursor() as cursor: cursor.execute(sql, (city_name,)) new_id cursor.lastrowid conn.commit() return new_id def main(): conn get_conn() try: cid insert_city(conn, 杭州) print(插入成功自增ID , cid) except Exception as e: conn.rollback() print(插入失败已回滚, e) finally: conn.close() if __name__ __main__: main()几个关键点SQL 里写全库名.表名避免跨库时找不到表参数用元组lastrowid在with块内取异常时rollback()。如果要做批量插入用executemany()sql insert into boss.City(city_name) values (%s) data [(北京,), (上海,), (广州,)] with conn.cursor() as cursor: cursor.executemany(sql, data) conn.commit()批量场景下lastrowid只代表第一条别指望它返回全部 ID。5. 逐项验证确认每一步真的生效写完代码别急着上生产按下面动作逐项验证。5.1 打印 SQL 与参数在execute()前加一行日志把最终 SQL 和参数打出来print(SQL:, sql) print(PARAMS:, params)这样报语法错时你能立刻看出是占位符问题还是值本身有问题。5.2 检查 autocommit 状态print(autocommit , conn.get_autocommit())如果是False就必须手动commit()。想省事可以连接时设autocommitTrue但批量写入时手动控制事务更安全。5.3 确认 commit / rollback 路径用一个故意失败的插入测试回滚try: cursor.execute(insert into boss.City(city_name) values (%s), (None,)) conn.commit() except Exception as e: conn.rollback() print(回滚成功, e)再查一次表确认没有脏数据。5.4 核对字符集SHOW VARIABLES LIKE character_set%; SHOW CREATE TABLE boss.City;连接、库、表三层字符集都应该是utf8mb4。插一条中文再查出来确认没变问号。5.5 验证 lastrowidcursor.execute(sql, (测试城市,)) print(lastrowid , cursor.lastrowid) conn.commit()拿到的 ID 应该和表里实际自增列一致。如果一直是 0检查表是否有自增主键。6. 本篇常见错误排查清单把上面这些坑整理成一张对照表出问题时按行排查。现象可能原因排查动作You have an error in your SQL syntax占位符加了引号 / 字符串拼接改%s参数化打印 SQL数据查不到没 commit检查 autocommit补 commit中文变问号字符集不是 utf8mb4查连接/库/表字符集lastrowid 为 0表无自增主键 / executemany查表结构单条插入取 ID跨库找不到表没写库名SQL 写全库.表连接挂起未提交事务未回滚异常分支加 rollback如果排查时想让模型帮你读报错、生成校验 SQL可以用模型对话入口快速验证https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite长期写编码任务、需要 Agent 辅助改代码的可以看 Coding Planhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite接入细节和参数说明统一看文档https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite控制台管理 Key 和用量https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteClaude Code 相关接入参考https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite最后留一个我踩过的坑cursor.execute()的第二个参数单值一定要写成(value,)少那个逗号pymysql 会把它当成可迭代对象拆开报的参数数量不匹配错误特别隐蔽。写库这件事参数化、commit、字符集、lastrowid 四件事盯住基本就不会再翻车了。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。