news 2026/10/1 20:43:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api 。

你需要拿到两样东西:API Key 和可用的 Model ID。Key 在控制台的 API Keys 页面创建,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建后复制保存,它只显示一次。Model ID 可以在模型对话页面确认,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,选一个你常用的对话模型即可。

接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面写了请求头格式和返回结构。核心就是三件套:Base URL 填https://taotoken.net/api,Key 填你创建的那串,Model ID 填你选的模型名。这三样在后面的 Python 请求里会直接用到。

如果你打算长期在编码场景里用,比如让模型持续帮你生成 SQL、补全脚本,可以看 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它面向的是需要稳定调用通道的开发者。Claude Code 相关的接入说明在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite ,如果你用 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", data=json.dumps({ "model": MODEL_ID, "messages": [{"role": "user", "content": prompt}] }).encode("utf-8"), headers={ "Content-Type": "application/json", "Authorization": f"Bearer {API_KEY}" }, method="POST" ) 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是主键,重复插入会触发IntegrityError,rollback()保证这条脏数据不会进库。再查一次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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,可以重新生成一个再试。

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_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。

OAuth 相关提示:如果你用 Claude Code 接入,遇到 OAuth 报错,检查配置文件里的 Base URL 和 Key 是否填对。Claude Code 的接入说明在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite ,按里面的三件套填: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 time:execute一次只能跑一条 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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,请求格式和返回结构都在里面。想先验证模型输出是否稳定,可以去模型对话页面试几条 SQL 生成:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。如果你打算长期在编码和 Agent 场景里用,Coding Plan 页面在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。

最后给一个实用技巧:把数据库路径、表名、字段名做成常量放在脚本顶部,模型生成 SQL 时把表结构一起塞进 prompt,这样返回的语句和你的实际表结构一致,不用每次手动改。跑完记得commit(),异常记得rollback(),游标和连接记得关。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 20:42:00

SpringBoot+Vue+MySQL图书管理系统:全栈毕设实战与排坑指南

1. 项目拆解:一个能打的全栈毕设到底应该长什么样图书管理系统算是计算机毕业设计里的“常青树”,每年都有大量学生选它。原因很简单:业务场景清晰、需求边界明确、功能点足够展示技术水平,又不容易被老师挑出“需求理解不清”的毛…

作者头像 李华
网站建设 2026/10/1 20:41:33

VS Code详细安装教程:从设置中文到插件安装,一次搞定开发环境

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 20:41:24

【嵌入式】通信接口基础:UART、RS232与RS485的关系与区别

目录1. UART是什么?2. TTL UART3. RS2324. RS4855. 三者关系6. 速率区别7. 放到你的STM32架构里9. 结束语相关文章:UART、RS232、RS485不是完全同一个东西。UART是通信协议/数据格式,RS232和RS485是电气接口标准。 可以理解为: 数…

作者头像 李华