ARTICLE DETAIL

资讯详情

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

SQLite 增删改查完整例子:用 TaoToken 统一 Key 跑通本地 CRUD 验证

SQLite 增删改查完整例子:用 TaoToken 统一 Key 跑通本地 CRUD 验证 1. 为什么本地 CRUD 验证总卡在“环境”这一步SQLite 增删改查完整例子说白了就是四件事建表、插入、查询、更新、删除跑通一遍心里就有底了。它适合谁适合正在学数据库、准备写后端小工具、或者需要在 AI 编程助手里快速验证一段 SQL 逻辑的开发者。SQLite 最大的好处是零服务、单文件、随拷随用一个.db文件就是整个数据库不用装 MySQL、不用配账号密码特别适合本地验证。但实际动手时很多人卡住的地方不是 SQL 语法而是“我该用什么工具去执行这些语句”。有人用命令行sqlite3有人用 Python 脚本有人干脆在 AI 对话里让模型帮忙生成再手动粘贴。问题在于如果你同时用多个 AI 工具比如一个写代码、一个查文档、一个跑 Agent每个工具都要单独配 Key、单独配模型地址配置一多就容易乱验证 CRUD 这种小事反而被环境问题拖住。这篇就换个思路用 TaoToken 统一 Key 把模型调用入口收敛成一个然后写一份可复制的 SQLite CRUD 脚本配合settings.json/config.toml配置骨架逐条执行、逐条校验结果。你跟着做能一次跑通建表、插入、查询、更新、删除全流程而且这套配置后面写别的本地验证脚本也能直接复用。TaoToken 在这里的角色不是数据库而是“统一模型入口”。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。你把它理解成一个 Key 管多个模型调用的中转层就行本地脚本里只认一个base_url和一个api_key换模型只改一个字段。2. TaoToken 前置拿 Key、配骨架、定模型2.1 拿 Key 与确认入口先到控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建完复制那串sk-开头的 Key后面配置里要用。API 基础地址统一用 https://taotoken.net/api 注意这个地址不带 UTM 参数直接写进配置即可。如果你只是想先验证模型能不能通可以打开模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 在里面发一句“你好”看有没有回复。这一步不是必须的但能帮你排除 Key 本身的问题。2.2 settings.json 配置骨架很多 AI 编程工具比如 Claude Code 类工具读的是settings.json。下面这份骨架你可以直接抄把api_key换成你自己的{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 入口ANTHROPIC_MODEL填你要用的模型名。实测下来把模型名单独拎出来配后面切换模型只改这一行比散落在代码里清爽得多。2.3 config.toml 配置骨架如果你用的是 Python 生态、习惯 TOML可以这样写[llm] base_url https://taotoken.net/api api_key sk-你的Key model claude-sonnet-4-20250514 timeout 60这份config.toml放在项目根目录脚本里用tomllibPython 3.11或tomli读进来就行。两种配置格式选一种别混用否则排查起来会多一层干扰。注意Key 不要提交到 Git。本地验证阶段可以放环境变量或者用.gitignore把配置文件排除掉。3. 可复制配置SQLite CRUD 脚本逐条拆解3.1 建表与连接先建一个crud_demo.py用标准库sqlite3不装任何第三方包import sqlite3 DB_PATH demo.db def get_conn(): conn sqlite3.connect(DB_PATH) conn.row_factory sqlite3.Row return conn def create_table(): conn get_conn() cur conn.cursor() cur.execute( CREATE TABLE IF NOT EXISTS person ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, sex TEXT, age INTEGER, code TEXT ) ) conn.commit() conn.close() print([建表] person 表已就绪)row_factory sqlite3.Row这行很关键它让查询结果能按列名取值比如row[name]比记下标位置舒服。CREATE TABLE IF NOT EXISTS保证重复执行不报错适合反复验证。3.2 插入数据def insert_person(name, sex, age, code): conn get_conn() cur conn.cursor() cur.execute( INSERT INTO person (name, sex, age, code) VALUES (?, ?, ?, ?), (name, sex, age, code) ) conn.commit() new_id cur.lastrowid conn.close() print(f[插入] id{new_id}, name{name}) return new_id用?占位符而不是字符串拼接一是防注入二是 SQLite 会自动处理类型。lastrowid拿到刚插入那行的主键后面更新、删除要用。3.3 查询数据def query_all(): conn get_conn() cur conn.cursor() cur.execute(SELECT id, name, sex, age, code FROM person ORDER BY id) rows cur.fetchall() conn.close() print(f[查询] 共 {len(rows)} 条) for r in rows: print(f id{r[id]} name{r[name]} sex{r[sex]} age{r[age]} code{r[code]}) return rowsfetchall()一次拿全部数据量大时改fetchmany(100)分批。这里ORDER BY id保证输出顺序稳定方便你对照预期结果。3.4 更新数据def update_person(pid, nameNone, sexNone, ageNone, codeNone): conn get_conn() cur conn.cursor() cur.execute( UPDATE person SET name COALESCE(?, name), sex COALESCE(?, sex), age COALESCE(?, age), code COALESCE(?, code) WHERE id ? , (name, sex, age, code, pid)) conn.commit() affected cur.rowcount conn.close() print(f[更新] id{pid}, 影响行数{affected}) return affectedCOALESCE(?, name)的意思是传了值就用新值传None就保留原值。这样你只想改年龄时其他字段传None即可不用先查再拼完整 SQL。rowcount返回实际改了几行如果传了个不存在的id这里会是 0能立刻发现。3.5 删除数据def delete_person(pid): conn get_conn() cur conn.cursor() cur.execute(DELETE FROM person WHERE id ?, (pid,)) conn.commit() affected cur.rowcount conn.close() print(f[删除] id{pid}, 影响行数{affected}) return affected删除同样看rowcount为 0 说明目标不存在。生产环境里删除前建议先SELECT确认本地验证阶段直接删也行反正数据可重建。3.6 串起来的主流程if __name__ __main__: create_table() pid1 insert_person(张三, 男, 28, A001) pid2 insert_person(李四, 女, 32, B002) query_all() update_person(pid1, age29) query_all() delete_person(pid2) query_all()这段主流程就是完整的 CRUD 闭环建表 → 插两条 → 查 → 改一条 → 再查 → 删一条 → 再查。每一步都有打印你能肉眼看到数据变化。4. 验证请求与成功结果4.1 执行脚本在终端里跑python crud_demo.py预期输出类似[建表] person 表已就绪 [插入] id1, name张三 [插入] id2, name李四 [查询] 共 2 条 id1 name张三 sex男 age28 codeA001 id2 name李四 sex女 age32 codeB002 [更新] id1, 影响行数1 [查询] 共 2 条 id1 name张三 sex男 age29 codeA001 id2 name李四 sex女 age32 codeB002 [删除] id2, 影响行数1 [查询] 共 1 条 id1 name张三 sex男 age29 codeA001看到年龄从 28 变 29、第二条被删掉就说明增删改查全部生效。4.2 用命令行二次校验脚本跑完再用sqlite3命令行确认数据真的落盘了sqlite3 demo.db SELECT * FROM person;输出1|张三|男|29|A001这一步能排除“脚本打印对了但没提交”的假象。conn.commit()有没有漏这里一查便知。4.3 让模型帮你解释结果如果你想验证模型调用是否也通了可以在模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 里贴一段上面的输出问“这个 CRUD 流程有没有问题”。模型能正常回复说明 Key 和入口都配对了。这一步和数据库验证是两条独立链路分开测更清晰。5. 本篇常见错排查5.1 报错no such table: person原因通常是create_table()没执行或者DB_PATH指向了别的目录。检查主流程里create_table()是不是第一个调用再确认脚本运行目录和demo.db生成目录一致。用绝对路径最稳import os DB_PATH os.path.join(os.path.dirname(__file__), demo.db)5.2 更新/删除影响行数为 0先确认id存在。可以在update_person前加一句query_all()看当前有哪些id。另一个常见原因是id类型不匹配比如传了字符串1而列是INTEGERSQLite 虽然会隐式转换但显式传int更保险。5.3 配置读不到 Keysettings.json或config.toml路径不对、字段名拼错都会导致读不到。检查ANTHROPIC_BASE_URL是不是https://taotoken.net/api注意结尾不要多加/v1之类的后缀除非文档明确要求。Key 前后有空格也会失败复制时留意。5.4 模型调用返回 401401 基本是 Key 无效或没带上。确认 Key 是控制台里新建的那串没有过期确认请求头里带了x-api-key或Authorization具体看工具要求。如果用的是 Claude Code 类工具检查settings.json里env字段有没有被正确加载。5.5 脚本重复执行插入重复数据insert_person没有去重逻辑跑两次就会有两份张三。验证阶段可以在主流程开头加一句清空conn get_conn() conn.execute(DELETE FROM person) conn.commit() conn.close()这样每次跑都是干净状态输出更好对照。6. 把统一 Key 用到长期编码里本地 CRUD 验证跑通后你会发现这套“统一 Key 单文件数据库”的组合很适合做小工具原型。但如果你要长期写代码、跑 Agent、做多轮对话单次调用就不够用了需要更稳定的额度和更顺的接入方式。这时候可以看下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它面向的就是长期编码和 Agent 场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了不同工具怎么填base_url和 Key。API Keys 管理页还是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite Key 多了之后在这里统一管别散落在各个配置文件里。我自己的习惯是本地验证脚本用一份 Key长期编码工具用另一份 Key分开管理出问题好定位。SQLite 这边demo.db验证完可以直接删脚本留着下次换张表名就能复用。真正要留意的坑是commit()别漏、id类型别混、配置路径别写相对路径——这三条踩过一次后面基本就顺了。
返回列表