ARTICLE DETAIL

资讯详情

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

Python 操作 sqlite3 增删改查:用 TaoToken 统一 Key 打通脚本与 AI 辅助调试

Python 操作 sqlite3 增删改查:用 TaoToken 统一 Key 打通脚本与 AI 辅助调试 1. 为什么本地脚本写 sqlite3还要折腾一个统一 Key如果你写过 Python 脚本处理本地数据大概率用过sqlite3。它是标准库不用装依赖一个.db文件就是一个完整数据库特别适合做小工具、爬虫落库、日志归档、配置缓存这类场景。但真正写起来痛点往往不在 SQL 本身而在两件事一是增删改查的样板代码反复写事务、游标、异常回滚每次都要抄一遍二是调试阶段遇到报错想找个 AI 辅助看看结果每个工具的 Key、Base URL、模型名都要单独配切来切去很烦。这篇就围绕「Python 操作 sqlite3 增删改查」这条主线把建表、插入、查询、更新、删除的可复制代码全部给到同时演示怎么把 AI 辅助工具的 Base URL 统一改到 TaoToken用一个 Key 打通脚本编写和 AI 辅助调试。适合谁适合正在用 Python 做本地数据管理、又想让 AI 帮忙看报错和补代码的开发者。核心检索词就是 python sqlite3 增删改查全文围绕它展开不跑题。先说清楚 sqlite3 的定位它是嵌入式数据库没有独立服务进程你的 Python 进程直接读写文件。这意味着它没有网络开销但也意味着并发写入能力有限适合单机、低并发。理解这一点后面的事务和锁问题就好解释了。我试过在一个数据清洗脚本里用 sqlite3 存中间结果几万条数据插入如果不用executemany和事务速度能差十几倍。所以下面的代码不只是「能跑」还会带上性能相关的写法。2. TaoToken 前置把 AI 辅助的 Base URL 统一到一处在写代码之前先把 AI 辅助这一环配好。很多人卡在「AI 工具连不上」或者「每个工具都要重新填 Key」其实只要把 Base URL 指向同一个入口就行。TaoToken 提供统一的 API 入口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数。你需要先拿到一个 Key。进入控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 然后在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。生成后复制保存后面配置里要用。这里要强调一个概念Base URL 是「请求发往哪里」Key 是「你是谁」Model ID 是「你要用哪个模型」。这三件套缺一不可。很多报错401就是 Key 不对local proxy failed往往是 Base URL 写错或者网络层拦截reading choices报错通常是返回体结构和你预期的不一致多半是 Model ID 或接口路径不对。如果你用的是 Claude Code 这类编码工具配置方式是把 Base URL 指向 TaoToken 的 API 地址Key 填刚生成的Model ID 按文档里支持的填。文档入口https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Claude Code 的接入说明在https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你用的是 Cline 或者带 MCP 的工具同样是把 Base URL、Key、Model ID 三件套填进去。Cline 的 MCP 配置里Base URL 用 https://taotoken.net/api Key 用你的Model ID 按需选。这样你在写 sqlite3 脚本时AI 辅助的请求都走同一个入口不用每个工具单独维护。对于长期做编码和 Agent 任务的可以考虑 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是想验证某个模型对话效果用模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。配好之后你在脚本里遇到sqlite3.OperationalError之类的报错直接贴给 AI 辅助让它帮你分析效率会高很多。下面进入正题写 sqlite3 的增删改查。3. 可复制配置建表、插入、查询、更新、删除全流程这一节给完整代码。先建一个person表字段有pno主键自增、pname、age、score。然后依次演示插入单条、插入多条、查询单条、查询全部、更新、删除。先看建表和连接的基础写法import sqlite3 # 连接数据库文件不存在会自动创建 con sqlite3.connect(test.db) cur con.cursor() # 建表IF NOT EXISTS 避免重复建表报错 create_sql CREATE TABLE IF NOT EXISTS t_person ( pno INTEGER PRIMARY KEY AUTOINCREMENT, pname TEXT NOT NULL, age INTEGER, score REAL ) cur.execute(create_sql) con.commit() cur.close() con.close()注意AUTOINCREMENT配合INTEGER PRIMARY KEY才能自增。如果你只写PRIMARY KEYSQLite 也会自增但行为略有差异建议显式写清楚。插入单条数据用参数化查询不要用字符串拼接避免 SQL 注入import sqlite3 con sqlite3.connect(test.db) cur con.cursor() insert_sql INSERT INTO t_person(pname, age, score) VALUES(?, ?, ?) try: cur.execute(insert_sql, (张三, 20, 88.5)) con.commit() except Exception as e: print(插入失败:, e) con.rollback() finally: cur.close() con.close()插入多条用executemany性能比循环execute好很多import sqlite3 con sqlite3.connect(test.db) cur con.cursor() insert_sql INSERT INTO t_person(pname, age, score) VALUES(?, ?, ?) data [(小李, 23, 90.0), (小花, 20, 85.5), (小明, 18, 78.0)] try: cur.executemany(insert_sql, data) con.commit() except Exception as e: print(批量插入失败:, e) con.rollback() finally: cur.close() con.close()查询单条用fetchone查询全部用fetchallimport sqlite3 con sqlite3.connect(test.db) cur con.cursor() query_sql SELECT * FROM t_person try: cur.execute(query_sql) person cur.fetchone() print(单条:, person) except Exception as e: print(查询失败:, e) finally: cur.close() con.close()import sqlite3 con sqlite3.connect(test.db) cur con.cursor() query_sql SELECT * FROM t_person try: cur.execute(query_sql) persons cur.fetchall() for p in persons: print(p) except Exception as e: print(查询失败:, e) finally: cur.close() con.close()更新数据注意WHERE条件一定要带否则全表更新import sqlite3 con sqlite3.connect(test.db) cur con.cursor() update_sql UPDATE t_person SET score ? WHERE pname ? try: cur.execute(update_sql, (95.0, 小李)) con.commit() print(影响行数:, cur.rowcount) except Exception as e: print(更新失败:, e) con.rollback() finally: cur.close() con.close()删除数据同样要带WHEREimport sqlite3 con sqlite3.connect(test.db) cur con.cursor() delete_sql DELETE FROM t_person WHERE pno ? try: cur.execute(delete_sql, (3,)) con.commit() print(影响行数:, cur.rowcount) except Exception as e: print(删除失败:, e) con.rollback() finally: cur.close() con.close()这里有个坑cur.execute(delete_sql, (3,))里的(3,)是单元素元组逗号不能省。如果你写(3)Python 会当成整数 3不是元组会报参数错误。这一点和某些数据库驱动不同务必注意。如果你想把连接管理写得更优雅可以用with语句import sqlite3 with sqlite3.connect(test.db) as con: cur con.cursor() cur.execute(SELECT * FROM t_person) print(cur.fetchall())with会在退出时自动提交或回滚但不会自动关闭连接这点和文件操作不同需要留意。4. 验证请求与成功结果命令行和脚本双向核对代码写完了怎么确认数据真的写进去了最直接的办法是用 sqlite3 命令行工具查一遍再和 Python 脚本的输出对比。先看命令行。在终端输入sqlite3 test.db进入交互模式后执行.headers on .mode column SELECT * FROM t_person;你会看到类似这样的输出pno pname age score --- ----- --- ----- 1 张三 20 88.5 2 小李 23 95.0 3 小花 20 85.5 4 小明 18 78.0注意pno3如果被删了这里就不会出现。命令行验证的好处是它绕过了 Python 层直接读文件能确认数据确实落盘了。再用 Python 脚本查一遍输出应该一致import sqlite3 con sqlite3.connect(test.db) cur con.cursor() cur.execute(SELECT * FROM t_person ORDER BY pno) for row in cur.fetchall(): print(row) cur.close() con.close()如果两边输出一致说明增删改查都正常。如果不一致先检查是不是有未提交的事务或者连接的是不同的.db文件。路径问题很常见sqlite3.connect(test.db)是相对当前工作目录的脚本和命令行的当前目录可能不同。再验证一下更新和删除的效果。更新后重新查询小李的score应该变成 95.0。删除后pno3的记录应该消失。这些都可以用上面的命令行和脚本各跑一遍。如果你在调试过程中遇到报错比如sqlite3.OperationalError: no such table: t_person可以把报错贴给 AI 辅助。因为前面已经把 Base URL 统一到 TaoToken你只需要在一个地方维护 Key不用每个工具重新配。模型对话入口可以用来快速验证https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。还有一个实用技巧用PRAGMA table_info(t_person);查看表结构确认字段类型和约束。命令行和 Python 里都能执行cur.execute(PRAGMA table_info(t_person)) for col in cur.fetchall(): print(col)输出会列出每个字段的cid、name、type、notnull、dflt_value、pk。这个在排查「为什么插入失败」时特别有用比如NOT NULL约束没满足。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节集中说报错。分两类一类是 sqlite3 本身的一类是 AI 辅助接入的。sqlite3 常见错误sqlite3.OperationalError: no such table: t_person—— 表没建或者连的库不对。先确认CREATE TABLE执行过再确认.db文件路径一致。sqlite3.IntegrityError: NOT NULL constraint failed—— 插入时某个NOT NULL字段传了None。检查数据里有没有空值。sqlite3.ProgrammingError: Incorrect number of bindings supplied—— 参数个数和占位符不匹配。比如 SQL 里有 3 个?你只传了 2 个值。sqlite3.OperationalError: database is locked—— 有另一个连接没释放或者事务没提交。确保commit或rollback后关闭游标和连接。AI 辅助接入常见错误401 Unauthorized—— Key 不对或没带。检查 API Keys 页面生成的 Key 是否复制完整有没有多余空格。重新生成入口https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。local proxy failed—— Base URL 写错或者本地网络层有拦截。确认 Base URL 是 https://taotoken.net/api 不要多加路径也不要带 UTM 参数。reading choices相关报错 —— 返回体结构和预期不符通常是 Model ID 填错或者接口路径不对。对照文档确认 Model IDhttps://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。OAuth相关报错 —— 多见于 Claude Code 这类工具的登录态问题。如果你用的是 Claude Code参考接入说明https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 确认 Base URL、Key、Model ID 三件套都填对。这里再强调一次三件套Base URL 用 https://taotoken.net/api Key 用你生成的Model ID 按文档选。任何一环错了都会报错。如果你用 Cline 的 MCP配置里同样填这三样。排查顺序建议先确认 Key 有效换个工具试再确认 Base URL 正确不要带多余路径最后确认 Model ID 存在。这样能快速定位问题在哪一层。6. 把统一 Key 用在日常脚本调试里回到主线。你现在有了完整的 sqlite3 增删改查代码也有了统一的 AI 辅助入口。日常写脚本时遇到报错直接贴给 AI让它帮你分析是 SQL 问题还是数据问题。因为 Base URL 统一到 TaoToken你只需要维护一个 Key不用在多个工具之间来回切换。对于长期做编码和 Agent 任务的Coding Plan 会更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是偶尔验证模型效果用模型对话入口就行https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后给一个实用建议把 sqlite3 的连接和常用操作封装成一个小类减少重复代码。比如import sqlite3 class DB: def __init__(self, pathtest.db): self.con sqlite3.connect(path) self.cur self.con.cursor() def execute(self, sql, paramsNone): try: self.cur.execute(sql, params or ()) self.con.commit() return self.cur except Exception as e: self.con.rollback() raise e def query(self, sql, paramsNone): self.cur.execute(sql, params or ()) return self.cur.fetchall() def close(self): self.cur.close() self.con.close()用的时候db DB() db.execute(INSERT INTO t_person(pname, age, score) VALUES(?, ?, ?), (王五, 25, 80.0)) print(db.query(SELECT * FROM t_person)) db.close()这样你的脚本会更干净调试时也更容易定位问题。配合统一的 AI 辅助入口写 sqlite3 增删改查的效率会明显提升。
返回列表