ARTICLE DETAIL

资讯详情

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

Spyder 写 xls 进 MySQL 后查不到数据?用 TaoToken 接入的 Codex 对着 pymysql 排查

Spyder 写 xls 进 MySQL 后查不到数据?用 TaoToken 接入的 Codex 对着 pymysql 排查 1. Spyder 里 xls 写进 MySQL为什么 SELECT 出来是空的你在 Spyder 里跑完一段看着毫无报错的脚本pandas.read_excel读D:\python\python名单.xlspymysql连上本地stu库DROP TABLE IF EXISTS PYTHON、CREATE TABLE PYTHON、循环INSERT控制台干干净净一行红字都没有。结果切回 MySQL 客户端敲一句SELECT * FROM PYTHON返回Empty set。表在字段也在就是没数据。这个现象在「Spyder xls MySQL」这条链路上特别常见因为出问题的往往不是 SQL 语法而是提交时机和连接生命周期。pymysql 默认不开自动提交cursor.execute()只是把语句发给服务端执行真正落盘要靠db.commit()。如果 commit 之前连接被关掉、或者 commit 写在了cursor.close()之后、又或者中途抛了异常被 try 吞掉数据就停在事务里没提交客户端自然查不到。我试过最坑的一种情况脚本里先cursor.close()再db.commit()本地跑不报错但数据就是不进库。原因是游标关了之后某些版本下挂起的语句状态处理不一致commit 实际没把 INSERT 刷进去。原文作者专门写了一句「如果没有这些关闭操作执行后在数据库中查看不到数据」说的就是这个坑只是他把 close/commit/close 的顺序当成了口诀没解释为什么。这篇就按排障视角走一遍先用 TaoToken 接入的 Codex 对着你的 pymysql 代码逐行核对提交位置和 INSERT 参数元组把「表建好了、SELECT 是空」定位到具体那一行再给出可复制的正确写法。TaoToken 在这里只做一件事——给你的 Codex 提供 Key 和模型通道连库、建表、写数据全部由你本地的 pymysql 完成不碰你的数据库。2. 前置给 Codex 配一个能读代码的模型通道排障这类问题靠人眼盯connect / cursor.execute / db.commit的先后顺序很容易漏。更稳的做法是让 Codex 把整段脚本当上下文逐行告诉你「这一行的作用是什么、提交发生在哪、参数元组对不对」。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号进控制台创建一个 API Key。然后在 Codex 的配置里把 Base URL 填成https://taotoken.net/api注意不带/v1这是很多人第一次配就报 404 的地方。Key 填你刚创建的那串模型选一个擅长读 Python 的即可。配好之后Codex 就能拿到你贴进去的 pymysql 代码帮你做三件事核对commit()是否在close()之前、核对INSERT的占位符数量与values元组长度是否一致、核对read_excel出来的列顺序和建表字段顺序是否对得上。这三件事恰好覆盖了「SELECT 为空」的绝大多数成因。需要提醒的是TaoToken 不参与你的数据库连接它只负责模型对话通道。你的localhost、root、密码、库名stu全部留在本地脚本里不要贴进对话。排障时把敏感信息替换成占位符再让 Codex 看习惯要养好。3. 可复制配置把提交位置和参数元组摆正先给一份能直接跑的骨架重点看注释标出的提交顺序。这段和你原文的结构一致只是把容易出错的点显式化了。import pandas as pd import pymysql filepath rD:\python\python名单.xls data pd.read_excel(filepath) db pymysql.connect( hostlocalhost, userroot, password你的密码, databasestu, charsetutf8mb4 ) cursor db.cursor() cursor.execute(DROP TABLE IF EXISTS PYTHON) sql CREATE TABLE PYTHON ( NUM CHAR(20) NOT NULL, STU_NUM CHAR(20) PRIMARY KEY, NAME CHAR(100), CLASS CHAR(111) ) cursor.execute(sql) query INSERT INTO PYTHON (NUM, STU_NUM, NAME, CLASS) VALUES (%s,%s,%s,%s) try: for r in range(len(data)): values ( str(data.iloc[r, 0]), str(data.iloc[r, 1]), str(data.iloc[r, 2]), str(data.iloc[r, 3]), ) cursor.execute(query, values) db.commit() # 关键所有 INSERT 之后再提交 except Exception as e: db.rollback() # 出错回滚避免半截数据 print(写入失败, e) finally: cursor.close() # 先关游标 db.close() # 再关连接几个必须盯死的点。第一db.commit()放在 for 循环外面、cursor.close()前面。放循环里每行提交一次也能work但慢且事务碎放 close 后面就是本文开头那个「查不到」的经典错法。第二values用元组而不是列表pymysql 对元组参数化更稳四个%s对应四个元素多一个少一个都会报not all arguments converted。第三read_excel读出来的NUM、STU_NUM可能是数字或 NaN统一str()转一下避免CHAR字段塞进 float 导致隐式转换异常。如果你想让 Codex 帮你核对把上面这段密码换成***贴进对话问它「commit 的位置对不对、values 元组和占位符是否匹配」。它会直接指出提交时机和参数长度问题比你自己来回改快得多。4. 验证切回 MySQL 客户端确认数据真的落库脚本跑完后别急着信 Spyder 控制台。切回 MySQL 客户端执行USE stu; SELECT COUNT(*) FROM PYTHON; SELECT * FROM PYTHON LIMIT 10;COUNT(*)返回的行数应该等于len(data)。如果这里是 0说明 commit 没生效如果行数对但字段是 NULL 或乱码那是编码或列顺序问题往下看第 5 节。想更直观一点可以在脚本末尾加一段独立查询用新的连接去读模拟客户端的视角db2 pymysql.connect(hostlocalhost, userroot, password你的密码, databasestu, charsetutf8mb4) cur2 db2.cursor() cur2.execute(SELECT COUNT(*) FROM PYTHON) print(落库行数, cur2.fetchone()[0]) cur2.close() db2.close()用新连接查是关键。同一个连接里查得到、新连接查不到基本就是没 commit两个连接都查不到才需要怀疑表名、库名或 INSERT 本身。这一步能把「事务没提交」和「数据压根没写进去」区分开省掉大量瞎猜。5. 本篇常见错排查报错一pymysql.err.ProgrammingError: not all arguments converted during string formatting占位符和参数数量不匹配。检查VALUES (%s,%s,%s,%s)是不是四个values元组是不是四个元素。常见于你改了建表字段但忘了改 INSERT 列表。报错二pymysql.err.IntegrityError: Duplicate entry xxx for key PRIMARYSTU_NUM是主键xls 里有重复学号。要么去重要么把主键换成自增 ID。Codex 能帮你快速定位是哪一行重复。现象三SELECT 出来是空但脚本无报错九成是 commit 位置错了或者 commit 被写在了cursor.close()之后。按第 3 节的顺序改先 commit再 close 游标最后 close 连接。现象四中文变成???或乱码连接时加charsetutf8mb4建表字段用CHAR时也确认库和表的字符集。xls 里的中文经str()转换后如果编码不对落库就是问号。现象五FileNotFoundError: D:\python\python名单.xlsWindows 路径里的反斜杠是转义符用rD:\python\python名单.xls原始字符串或者改成正斜杠D:/python/python名单.xls。现象六表建好了但字段顺序和 xls 对不上data.iloc[r, 0]取的是第 0 列建表第一个字段是NUM。如果 xls 列顺序变了INSERT 就会错位。让 Codex 对着data.columns和建表语句比一遍最快。6. 把排障流程固定下来这套流程跑通一次之后建议固化成习惯写完 pymysql 脚本先让 Codex 核对 commit 位置和参数元组再跑脚本最后用新连接执行SELECT COUNT(*)验证。三步下来「表建好了、SELECT 是空」这类问题基本当场现形。需要长期在 Spyder 里做数据入库、反复调 SQL 的话可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite把模型通道固定下来省得每次重新配。只想快速验证模型能不能读懂你的代码直接开模型对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite贴代码问就行。Key 管理和接入细节在 API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite和接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里都有配 Base URL 时记得https://taotoken.net/api不带/v1。最后留一个我踩过的坑别在 for 循环里db.commit()之后又cursor.close()再继续循环游标关了后面execute会直接抛异常。提交只做一次放在循环外这是最省心的写法。
返回列表