1. 为什么初学者需要一个「统一 Key」的数据库脚本
如果你刚开始学 Python,大概率会遇到这样一个场景:跟着教程写了几行sqlite3代码,本地建库、建表、插入数据都跑通了,心里挺爽。但下一步想接个大模型接口做点智能问答、文本处理,问题就来了——不同厂商的 Key 格式不一样,环境变量名不一样,请求地址也不一样。脚本里到处散落着api_key、base_url,改一个地方要翻三个文件。
sqlite3是 Python 标准库自带的模块,不用pip install,直接import sqlite3就能用。它把整个数据库存成一个.db文件,适合本地练习、小型工具、原型验证。而 TaoToken 做的事情,是给你一个统一的 Key 和统一的 API 通道,让你在脚本里只维护一份配置,就能调用不同的大模型能力。
这篇文章的目标很明确:带你从零跑通一个最小闭环。你会拿到一份可复制的config.toml骨架和settings.json示例,然后依次执行建表、插入、查询三步验证动作。跑完之后,你的本地环境里会有一个真实的example.db文件,同时你的调用链配置也已经就位,后面想加模型对话、代码补全,直接在这个骨架上扩展就行。
适合谁看?刚学完 Python 基础语法、想动手写点真东西的初学者;手里有几个不同平台 Key、被配置管理搞烦的开发者;以及想用sqlite3做本地数据缓存、又不想引入重型数据库的实践者。
2. TaoToken 前置准备:把 Key 和地址收拢到一处
在写数据库脚本之前,先把「调用通道」这件事理清楚。TaoToken 的官网入口是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,API 基础地址是https://taotoken.net/api。注意这两个地址的用途不同:官网用来注册、查看文档、管理额度;API 地址是脚本里真正发请求的地方。
你需要做的第一件事,是拿到一个 API Key。进入控制台后创建 Key,复制出来先放到一边。这里有个习惯建议:不要把 Key 硬编码进.py文件,而是写进配置文件,再用.gitignore排除掉。原因很简单,一旦你把带 Key 的脚本传到公开仓库,Key 就等于泄露了,后面可能被人刷额度。
TaoToken 的定位是统一 Key / API 通道,也就是说你不需要在脚本里为每个模型单独写一套请求逻辑。对于本篇的sqlite3场景,我们先把配置骨架搭好,数据库部分照常跑,模型调用部分留出接口。这样等你学完建表插入查询,下一步接模型对话时,只需要在同一个配置文件里加一段就行。
如果你后面要做长期编码或者 Agent 类项目,可以关注 Coding Plan 相关的入口;如果只是想先验证模型能不能通,模型对话页面更直接。但本篇的重点是数据库脚本,所以先把 Key 和地址这两样东西准备好,我们进入配置环节。
3. 可复制配置:config.toml 骨架与 settings.json 示例
配置文件的作用,是把「会变的东西」和「不变的代码」分开。下面这份config.toml骨架,你可以直接复制到项目根目录,改掉api_key那一行即可。
# config.toml [app] name = "sqlite3-demo" debug = true [taotoken] api_key = "把你的Key粘贴到这里" base_url = "https://taotoken.net/api" timeout = 30 [database] path = "example.db" echo_sql = false这份配置里,[taotoken]段落就是统一通道的入口。base_url固定指向 API 地址,api_key是你从控制台拿到的凭证,timeout控制请求超时秒数。[database]段落管的是sqlite3的库文件路径,echo_sql打开后可以打印执行的 SQL,方便调试。
Python 3.11 及以上版本自带tomllib,可以直接读 TOML 文件。如果你用的是更早的版本,装一个tomli就行。读取代码如下:
import tomllib with open("config.toml", "rb") as f: config = tomllib.load(f) api_key = config["taotoken"]["api_key"] base_url = config["taotoken"]["base_url"] db_path = config["database"]["path"] print("配置加载完成,数据库路径:", db_path)有些同学可能更习惯 JSON 格式,那也没问题。下面这份settings.json是等价写法:
{ "app": { "name": "sqlite3-demo", "debug": true }, "taotoken": { "api_key": "把你的Key粘贴到这里", "base_url": "https://taotoken.net/api", "timeout": 30 }, "database": { "path": "example.db", "echo_sql": false } }读取 JSON 用标准库json即可:
import json with open("settings.json", "r", encoding="utf-8") as f: settings = json.load(f) print("Key 前缀:", settings["taotoken"]["api_key"][:6] + "...")两种格式选一种就行,不要同时维护两份,否则改了一处忘了另一处,排查起来很痛苦。我个人的习惯是:纯 Python 项目用 TOML,因为可读性好、支持注释;如果配置要和前端或其他语言共享,就用 JSON。
注意:
api_key这一行千万不要提交到 Git。在项目根目录建一个.gitignore,把config.toml、settings.json、*.db都写进去。
4. 三步验证:建表、插入、查询一次跑通
配置就位后,我们开始写数据库脚本。sqlite3的核心流程就四步:连接、拿游标、执行 SQL、提交并关闭。下面这个脚本把建表、插入、查询串在一起,你可以直接保存为demo.py运行。
import sqlite3 import tomllib # 1. 读取配置 with open("config.toml", "rb") as f: config = tomllib.load(f) db_path = config["database"]["path"] # 2. 连接数据库(文件不存在会自动创建) conn = sqlite3.connect(db_path) cursor = conn.cursor() # 3. 建表:person 和 address 两张表,用外键关联 cursor.execute(""" CREATE TABLE IF NOT EXISTS person ( id INTEGER PRIMARY KEY ASC, name VARCHAR(250) NOT NULL ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS address ( id INTEGER PRIMARY KEY ASC, street_name VARCHAR(250), street_number VARCHAR(250), post_code VARCHAR(250) NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY (person_id) REFERENCES person(id) ) """) # 4. 插入数据 cursor.execute("INSERT INTO person VALUES (1, 'pythoncentral')") cursor.execute("INSERT INTO address VALUES (1, 'python road', '1', '00000', 1)") # 5. 提交事务 conn.commit() # 6. 查询验证 cursor.execute("SELECT * FROM person") print("person 表:", cursor.fetchall()) cursor.execute("SELECT * FROM address") print("address 表:", cursor.fetchall()) # 7. 关闭连接 conn.close()运行python demo.py,你会看到类似这样的输出:
person 表: [(1, 'pythoncentral')] address 表: [(1, 'python road', '1', '00000', 1)]到这里,建表、插入、查询三步就全部验证通过了。项目目录下会多出一个example.db文件,这就是你的本地数据库。你可以用sqlite3 example.db命令进入命令行,输入.tables查看表名,输入SELECT * FROM person;再确认一遍数据。
这里解释几个初学者容易忽略的点。第一,CREATE TABLE IF NOT EXISTS里的IF NOT EXISTS很重要,它让脚本可以重复运行而不报错。第二,conn.commit()必须调用,否则插入的数据不会真正写入文件,程序退出后就丢了。第三,fetchall()返回的是列表,每个元素是一个元组,对应一行记录。
如果你想把数据库路径也做成可配置的,上面代码已经通过config["database"]["path"]读取了,改 TOML 文件即可,不用动 Python 代码。这就是配置分离的好处。
5. 本篇常见错排查:从报错到修复
即使代码照抄,初学者还是会遇到一些典型报错。下面这几个是我在带人过程中见得最多的,逐个说清楚原因和修法。
报错一:ModuleNotFoundError: No module named 'tomllib'
这说明你的 Python 版本低于 3.11。tomllib是 3.11 才进标准库的。解决办法有两个:升级 Python,或者装tomli并改导入语句:
import tomli as tomllib装的时候用pip install tomli。功能上完全等价,只是包名不同。
报错二:sqlite3.OperationalError: table person already exists
如果你没用IF NOT EXISTS,第二次运行脚本就会撞上这个错。修法很简单,把建表语句改成CREATE TABLE IF NOT EXISTS person (...)。或者你在调试阶段想每次重建,可以在连接后先执行DROP TABLE IF EXISTS person,但生产环境别这么干。
报错三:sqlite3.IntegrityError: UNIQUE constraint failed: person.id
主键冲突。你重复插入了id=1的记录。sqlite3的主键默认是唯一的,第二次插入同一个 id 就会报这个错。修法:要么先清空表DELETE FROM person,要么把插入语句改成INSERT OR IGNORE,要么用自增主键不手动指定 id。
报错四:查询结果为空[]
数据明明插了,查出来却是空列表。最常见的原因是忘了conn.commit()。sqlite3默认开启事务,不提交的话数据只在连接内可见,换个连接或程序退出就没了。另一个可能是你查的表名拼错了,比如建的是person,查的是persons。
报错五:config.toml读取失败TOMLDecodeError
TOML 对格式比较敏感。检查一下字符串有没有加引号,比如api_key = 你的Key是错的,必须写成api_key = "你的Key"。布尔值true是小写,不能写成True。段落头[taotoken]要单独占一行。
报错六:Key 读取到了但请求 401
如果你后面接模型调用时遇到 401,先确认base_url是不是https://taotoken.net/api,注意结尾不要多加斜杠。再确认 Key 有没有多余空格,复制的时候容易带上换行。可以在脚本里打印repr(api_key)看看有没有隐藏字符。
提示:排查配置问题时,先把
debug打开,把加载到的base_url和 Key 前缀打印出来,比盲猜快得多。
6. 下一步:把统一 Key 接进你的脚本调用链
数据库部分跑通之后,你的项目里已经有了一个稳定的本地存储层。接下来要做的,是在同一个配置体系下接入模型调用。因为config.toml里已经预留了[taotoken]段落,你只需要在代码里读取api_key和base_url,然后按标准方式发请求即可。
如果你主要想验证模型能不能通、回答质量如何,可以直接用模型对话页面手动试几条,确认通道正常后再写进脚本。如果你打算做长期的编码辅助或者 Agent 项目,Coding Plan 相关的入口更适合,因为它面向的是持续调用场景。而当你需要管理多个 Key、查看用量、创建新凭证时,API Keys 管理页面和接入文档是两个必须收藏的地址。
回到本篇的核心:sqlite3是 Python 标准库里最容易被低估的模块之一。它不需要额外安装,不需要启动服务,一个文件就是一个数据库。配合统一的 Key 配置,你可以把「本地数据」和「模型能力」放在同一个脚本里,前者负责存,后者负责算。这个组合在原型阶段非常高效。
最后留一个可执行的练习:把上面的demo.py改一改,加一个query_person(person_id)函数,根据 id 查询姓名并打印。然后再加一个insert_person(name)函数,用自增 id 插入新记录。跑通之后,你就真正掌握了sqlite3的增查闭环,而不是只会照抄示例。