ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pymysql 游标 execute 批量提交:查与增的结果是否受 SQL 提交顺序影响?TaoToken 配置骨架实测

pymysql 游标 execute 批量提交:查与增的结果是否受 SQL 提交顺序影响?TaoToken 配置骨架实测 1. pymysql 游标 execute 批量提交时查询与新增的顺序到底谁说了算先把结论摆在前面在 pymysql 里cursor.execute()执行INSERT/UPDATE/DELETE/CREATE这类写操作时改动先落在当前连接的事务里必须靠db.commit()才真正生效而SELECT不走这套缓冲逻辑它执行的那一刻就直接去数据库读当前已提交的数据。所以「查和增的结果是否受提交顺序影响」这个问题答案不是「受 execute 顺序影响」而是「受 commit 时机影响」。很多人第一次写批量 SQL 时会有一个直觉既然我把多条语句都塞进游标了那它们应该像队列一样按顺序一起执行查询自然能查到同一批里刚插入的记录。这个直觉在 pymysql 上是错的。我试过把create table、insert、select混在同一个try块里只 commit 一次结果select直接抛(1146, Table xxx doesnt exist)因为建表语句还没提交表在数据库里根本不存在而查询是立刻去库里找表的。这篇文章面向的是正在用 pymysql 做批量写入、又对事务可见性犯迷糊的开发者。核心检索词就是 pymysql cursor execute 批量提交 查询顺序。我会把「先增后查」和「先查后增」两种写法都跑一遍给出可复制的配置骨架再解释为什么会出现「查询阻塞后拿到两条记录」这种反直觉现象。适合已经会连数据库、但没系统理清事务边界的同学。需要说明的是下面所有实验都基于 InnoDB 引擎因为只有它支持事务和行级锁。MyISAM 不支持事务commit基本是空操作结论会不一样这点先记住。2. TaoToken 统一 Key 与 API 通道前置配置在跑数据库实验之前先把模型调用这条链路配好因为后面排查 SQL 报错、让模型帮忙解释(1146)这类错误码时会频繁用到对话接口。TaoToken 在这里的角色是统一入口一个 Key 走通模型对话、编码计划、控制台和文档几条路径省得每个服务单独配一套凭证。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数保持干净。你需要先拿到 Key再去控制台确认额度。拿 Key 的页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。如果你打算长期做编码和 Agent 类任务可以看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。只是想验证某个模型能不能正确解释 SQL 事务用模型对话页就够了https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。这里要强调一个配置原则Base URL、Key、Model ID 三件套必须同时给全缺一个都会在请求时报错。很多人只填了 Key 忘了 Base URL结果请求打到默认地址上返回 401 或者连接失败然后误以为是 Key 无效。下面第 3 节我会给出完整的 config.toml 和 settings.json 骨架路径和字段名都按实际能用的写法来。3. 可复制的 config.toml 与 settings.json 配置骨架先给数据库侧的配置。pymysql 连接参数里最容易踩的坑是port必须是 int写成字符串3306在某些版本下会报类型错误。下面这份config.toml把数据库和模型通道分开写方便你直接复制# config.toml [mysql] host localhost user root password your_password database db5 charset utf8 port 3306 # 注意是 int不是字符串 [taotoken] base_url https://taotoken.net/api api_key sk-你的Key model_id claude-sonnet-4-5对应的settings.json骨架适合放在项目根目录被代码读取{ mysql: { host: localhost, user: root, password: your_password, database: db5, charset: utf8, port: 3306 }, taotoken: { base_url: https://taotoken.net/api, api_key: sk-你的Key, model_id: claude-sonnet-4-5 } }如果你用的是 Claude Code 这类工具配置通常落在settings.json的 env 段里写法是{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }Codex 用户则对应auth.json字段是OPENAI_BASE_URL、OPENAI_API_KEY、OPENAI_MODEL三个逻辑一样Base URL 指向 https://taotoken.net/api Key 填你申请的那串Model ID 按文档里列出的可用模型填。文档页在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 模型名以那里为准别自己猜。配置好之后先用一段最小代码验证通道是否通import json import urllib.request with open(settings.json, r, encodingutf-8) as f: cfg json.load(f)[taotoken] req urllib.request.Request( f{cfg[base_url]}/v1/messages, datajson.dumps({ model: cfg[model_id], max_tokens: 64, messages: [{role: user, content: 回复 ok}] }).encode(), headers{ Content-Type: application/json, x-api-key: cfg[api_key], anthropic-version: 2023-06-01 } ) print(urllib.request.urlopen(req).read().decode())能打印出正常响应说明 Base URL Key Model ID 三件套没问题可以进入数据库实验环节。4. 顺序调换前后的对比验证与结果记录现在进入正题。先建表并插入一条记录统一 commit这一步没问题import pymysql db pymysql.connect( hostlocalhost, userroot, passwordyour_password, databasedb5, charsetutf8, port3306 ) cur db.cursor() try: c_sql create table test1( id int(3) zerofill primary key auto_increment, name varchar(15) not null )engineInnoDB,charsetutf8; i_sql insert into test1(name) values(chizer); cur.execute(c_sql) cur.execute(i_sql) db.commit() except Exception as e: db.rollback() print(Failed:, e) finally: cur.close() db.close()把顺序调换先 insert 再 create统一 commit会直接报错Failed: (1146, Table db5.test1 doesnt exist)原因很直白表还没建插入语句执行时数据库里找不到目标表。这说明写操作虽然进了事务缓冲但语法和对象存在性检查是在 execute 那一刻就做的不是等到 commit。接下来是核心对比。第一种写法先 commit 再查询cur.execute(c_sql) cur.execute(i_sql) db.commit() # 先提交 cur.execute(select * from test1;) print(cur.fetchall()) # ((1, chizer),)第二种写法查询夹在插入和 commit 之间cur.execute(c_sql) cur.execute(i_sql) db.commit() cur.execute(insert into test1(name) values(chizer2);) cur.execute(select * from test1;) # 查询在第二次 commit 之前 print(cur.fetchall()) # ((1, chizer), (2, chizer2)) db.commit()第二种结果很反直觉第二条插入还没 commit查询却查到了两条。实测下来执行到查询那一步时会有轻微停顿说明查询被阻塞了等前面的写事务处理完才返回。换句话说SELECT不会把结果缓存到游标里等 commit它是直接去库里读读的时候如果撞上未提交的写事务会按隔离级别决定是等待还是读旧值。记录结果时建议用表格对照方便复盘写法execute 顺序commit 时机查询结果Acreate, insert, commit, select查询前1 条Bcreate, insert, commit, insert, select, commit查询在第二次 commit 前2 条Cselect, create, insert, commit查询在最前报错 1146结论收敛成一句话查询结果和 commit 的先后顺序强相关和 execute 的排队顺序没有直接关系。查询不需要 commit它执行即读库。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth跑上面实验时数据库侧和模型侧都可能报错分开说。数据库侧最常见的是(1146, Table db5.test1 doesnt exist)。这个不是配置问题是执行顺序问题查询或插入跑在了建表 commit 之前。排查方法是在每个cur.execute()后面打印一句日志确认表到底建没建。另一个坑是port写成字符串报TypeError或连接超时检查 config.toml 里是不是port 3306。模型侧如果报 401先确认三件套是否齐全。Base URL 必须是 https://taotoken.net/api Key 从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 拿Model ID 从文档页核对。三者缺一或者 Base URL 写成了带路径的完整接口地址都会 401。local proxy failed通常出现在本地网络层和 Key 无关检查本机是否有拦截流量的软件在跑关掉再试。reading choices这类报错一般是响应体解析失败多半是 Model ID 填错导致返回了非预期结构去文档页确认模型名拼写。OAuth 相关报错出现在 Claude Code 场景说明工具走了账号登录而不是 API Key需要在 settings.json 里显式写ANTHROPIC_API_KEY覆盖掉 OAuth 流程。排查顺序建议先确认网络能通再确认三件套最后看模型名。数据库侧则先看 execute 日志再看 commit 位置。把这两条链路分开查能省很多时间。6. 把查询和提交的边界记牢比背结论更有用回到最初那个问题pymysql 游标 execute 批量提交查和增的结果是否受提交顺序影响。答案是受 commit 顺序影响不受 execute 排队顺序影响。查询不走事务缓冲执行即读库写操作进事务commit 才落地。理解这一点很多「为什么查不到刚插入的数据」的困惑就自然消失了。如果你还想让模型帮你分析具体的报错栈可以用模型对话页把错误码贴进去问https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。长期做数据库和编码任务的话Coding Plan 那条通道更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入细节和模型清单都在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后留一个实用习惯每次写批量 SQL在 commit 前后各打一行日志标清楚「提交前」和「提交后」再跑一次查询对比。这个动作花不了几秒但能让你对事务可见性的判断从猜测变成事实。
返回列表