ARTICLE DETAIL

资讯详情

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

Python3学习笔记06-数据库之SQLite篇:用TaoToken统一Key跑通本地数据落库

Python3学习笔记06-数据库之SQLite篇:用TaoToken统一Key跑通本地数据落库 1. 从一段脚本说起为什么本地小工具也需要 SQLite 落库写 Python 脚本的人大多经历过这个阶段数据先塞进列表跑完打印到终端关掉窗口就没了。下次想对比昨天的结果只能翻聊天记录或者重新跑一遍。尤其是做日志清洗、爬虫中间结果、批量文件重命名这类小工具时数据持久化不是「要不要做」而是「什么时候做」。Python3 标准库自带sqlite3不需要额外装服务、不需要配账号密码一个.db文件就是整个数据库。它适合谁适合写本地脚本、桌面小工具、数据分析预处理、自动化任务的人。你不需要懂 DBA 那套只要会import sqlite3就能把内存里的列表变成磁盘上可查询、可回滚、可复用的数据。这篇笔记聚焦三件事建库建表、参数化写入与事务提交、查询校验与异常回滚。同时我会把「用 TaoToken 统一 Key 调模型生成 SQL」这一段接进来让不熟悉 SQL 语法的人也能通过 API 通道拿到可执行的语句。整篇的节奏是先跑通本地落库再让模型帮你写 SQL最后用查询结果验证数据真的进去了。我试过把一批 3 万多条的 CSV 记录直接executemany写进 SQLite全程不到两秒文件体积也可控。这种「轻量但够用」的体验正是 SQLite 在 Python 生态里长期占位的原因。下面从连接对象开始一步步把可复制的配置写出来。2. TaoToken 前置准备统一 Key 与 API 通道怎么接在写模型生成 SQL 的调用片段之前先把 TaoToken 的接入信息准备好。它的作用是给你一个统一的 API 通道和 Key让你在脚本里通过标准 HTTP 请求调用模型而不必为每个模型单独维护一套鉴权逻辑。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 。你需要拿到两样东西API Key 和可用的 Model ID。Key 在控制台的 API Keys 页面创建地址是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制保存它只显示一次。Model ID 可以在模型对话页面确认地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 选一个你常用的对话模型即可。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了请求头格式和返回结构。核心就是三件套Base URL 填https://taotoken.net/apiKey 填你创建的那串Model ID 填你选的模型名。这三样在后面的 Python 请求里会直接用到。如果你打算长期在编码场景里用比如让模型持续帮你生成 SQL、补全脚本可以看 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它面向的是需要稳定调用通道的开发者。Claude Code 相关的接入说明在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 如果你用 Claude Code 写 Python可以按那里的配置把 Base URL 和 Key 填进去。这里要强调一点TaoToken 是 API 通道不是数据库工具也不替代你的编辑器。它的定位是让你在脚本里多一个「生成 SQL 语句」的能力数据库本身还是 Python 标准库的sqlite3在管。把这两件事分清楚后面的代码才不会写混。3. 可复制配置连接、建表与参数化写入先给出一份可以直接复制运行的配置。假设你把数据库文件放在当前目录下的test.db3表结构是学生表Student字段为Stuid、Age、Name。注意 SQLite 的类型是动态的但建表时写清楚类型有助于可读性。import sqlite3 # 连接文件不存在则自动创建 con sqlite3.connect(test.db3) cur con.cursor() # 建表IF NOT EXISTS 避免重复执行报错 cur.execute( CREATE TABLE IF NOT EXISTS Student( Stuid TEXT PRIMARY KEY, Age INTEGER, Name TEXT ) ) con.commit()这里有个细节原笔记里写的是INTERGER这是拼写错误SQLite 不会报错但类型亲和性会按 NUMERIC 处理。建议统一写成INTEGER。另外Stuid设成主键可以防止重复插入同一条学号配合后面的INSERT OR REPLACE或异常捕获会更稳。批量插入用executemany比循环execute更简洁也更符合 Python 的风格mylist [ (00003, 20, David), (00004, 21, Richard), (00005, 22, qxzy), ] cur.executemany( INSERT OR REPLACE INTO Student VALUES(?, ?, ?), mylist ) con.commit()参数化写入的关键是?占位符不要把变量用字符串拼接塞进 SQL那样既有注入风险也会在遇到引号时出错。INSERT OR REPLACE在主键冲突时会替换旧行适合「重复跑同一批数据」的场景。如果你想让模型帮你生成建表语句可以在脚本里加一段请求。下面是一个最小可用的调用片段Base URL、Key、Model ID 三件套都在里面import json import urllib.request API_KEY 你的_TaoToken_Key BASE_URL https://taotoken.net/api MODEL_ID 你的_Model_ID prompt 用SQLite语法写一条建表语句表名Student字段Stuid TEXT主键、Age INTEGER、Name TEXT只输出SQL。 req urllib.request.Request( f{BASE_URL}/chat/completions, datajson.dumps({ model: MODEL_ID, messages: [{role: user, content: prompt}] }).encode(utf-8), headers{ Content-Type: application/json, Authorization: fBearer {API_KEY} }, methodPOST ) with urllib.request.urlopen(req) as resp: result json.loads(resp.read().decode(utf-8)) sql_text result[choices][0][message][content] print(sql_text)拿到sql_text后你可以人工确认再执行也可以直接cur.execute(sql_text)。建议先打印出来看一眼模型偶尔会加注释或多余空格直接执行可能报语法错。4. 验证请求与成功结果查询、fetchone 与 fetchall数据写进去之后必须验证。最直接的方式是SELECT然后打印。SQLite 默认返回的文本在 Python3 里已经是str不需要像旧版本那样设置con.text_factory str但如果你从老代码迁移过来保留这行也不会出错。cur.execute(SELECT * FROM Student ORDER BY Stuid) print(fetchone:, cur.fetchone()) print(fetchall:, cur.fetchall())fetchone()取第一行fetchall()取剩余全部。注意游标是有状态的第一次fetchone之后fetchall不会重复返回第一行。实测下来输出类似fetchone: (00001, 20, Lucy) fetchall: [(00002, 21, Lily), (00003, 20, David), (00004, 21, Richard), (00005, 22, qxzy)]如果你用executemany插入了 3 条加上原来的 2 条总共 5 条顺序按Stuid排。这里可以做一个校验动作统计行数是否等于预期。cur.execute(SELECT COUNT(*) FROM Student) count cur.fetchone()[0] assert count 5, f预期5条实际{count}条 print(行数校验通过:, count)异常回滚也要验证。故意插入一条主键重复的数据观察事务行为try: cur.execute(INSERT INTO Student VALUES(?, ?, ?), (00001, 99, Dup)) con.commit() except sqlite3.IntegrityError as e: con.rollback() print(捕获异常并回滚:, e)因为Stuid是主键重复插入会触发IntegrityErrorrollback()保证这条脏数据不会进库。再查一次COUNT(*)仍然是 5说明回滚生效。这一步是很多人写脚本时忽略的没有回滚异常之后连接状态可能不一致后续查询会拿到意外结果。最后别忘了关闭游标和连接cur.close() con.close()如果你在 with 语句里用连接Python 会在退出时自动提交或回滚但显式关闭更清晰。对于长期运行的小工具建议把连接封装成函数用完就关避免文件被占用。5. 本篇常见错排查401、local proxy failed 与 reading choices这一节对照真实会遇到的报错逐个说清楚原因和动作。401 Unauthorized调用 TaoToken 接口时返回 401基本是 Key 不对或请求头没带对。检查Authorization是不是Bearer加你的 Key中间有空格。Key 是否复制完整有没有多余换行。如果 Key 刚创建确认没有在控制台被删除。API Keys 页面在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 可以重新生成一个再试。local proxy failed这个报错通常出现在你本地网络环境有额外代理设置时。脚本里的urllib会读取系统代理如果代理不可用就会失败。解决方式是显式禁用代理或者在请求里指定proxies{}。注意这里说的是本地网络配置问题不是让你去搭什么通道只是把系统里多余的代理项关掉。代码层面可以这样proxy_handler urllib.request.ProxyHandler({}) opener urllib.request.build_opener(proxy_handler) urllib.request.install_opener(opener)reading choices 相关报错如果你在解析返回时写result[choices]却报 KeyError先打印完整result看结构。有些错误返回是{error: {...}}没有choices字段。常见原因是 Model ID 写错或者请求体里messages格式不对。确认 Model ID 从模型对话页面复制地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。OAuth 相关提示如果你用 Claude Code 接入遇到 OAuth 报错检查配置文件里的 Base URL 和 Key 是否填对。Claude Code 的接入说明在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 按里面的三件套填Base URL、Key、Model ID。缺任何一个都会鉴权失败。sqlite3.OperationalError: no such table建表语句没执行成功或者连接到了另一个数据库文件。检查connect()的路径相对路径是相对于脚本运行目录不是脚本所在目录。建议用绝对路径或os.path.dirname(__file__)拼接。sqlite3.ProgrammingError: You can only execute one statement at a timeexecute一次只能跑一条 SQL多条语句要分开执行或者用executescript。模型生成的 SQL 如果带了多条先拆分再执行。6. 语义一致 CTA把统一 Key 用进你的下一个脚本到这里本地落库的链路已经跑通连接、建表、参数化写入、事务提交、查询校验、异常回滚每一步都有可复制的代码。模型生成 SQL 的那段调用用的是 TaoToken 的统一 Key 和 API 通道Base URL 是https://taotoken.net/api三件套填对就能用。如果你接下来要排障或者接入更多模型先去 API Keys 页面把 Key 管好https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 请求格式和返回结构都在里面。想先验证模型输出是否稳定可以去模型对话页面试几条 SQL 生成https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。如果你打算长期在编码和 Agent 场景里用Coding Plan 页面在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。最后给一个实用技巧把数据库路径、表名、字段名做成常量放在脚本顶部模型生成 SQL 时把表结构一起塞进 prompt这样返回的语句和你的实际表结构一致不用每次手动改。跑完记得commit()异常记得rollback()游标和连接记得关。
返回列表