ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python 操作 SQLite 实战:从建表到查询的完整指南

2026/10/3 6:35:31 拓冰建站 浏览量
Python 操作 SQLite 实战:从建表到查询的完整指南 1. 为什么我建议你先用 sqlite3 而不是 MySQLPython 操作 SQLite 这件事说简单也简单说容易踩坑也是真的。sqlite3是 Python 标准库自带的模块不需要 pip 安装任何东西一个.db文件就是一个完整数据库特别适合本地工具、自动化脚本、爬虫落库、桌面小应用这类场景。你不需要启动服务、不需要配账号密码、不需要管端口sqlite3.connect(test.db)一行就能开工。它适合谁如果你在写自动化测试脚本、做数据清洗、给小型项目做本地存储或者只是想找个地方把爬下来的数据存起来SQLite 就是最省心的选择。它不适合高并发写入、多进程同时改同一张表、或者需要网络访问的分布式场景这些情况你该去看 PostgreSQL 或 MySQL。我见过太多人卡在几个地方一是建表时字段类型写错二是插入中文报编码问题三是忘了commit()导致数据没落盘四是拼接 SQL 字符串被注入或者因为引号报错。这篇就按「建表 → 增删改查 → 事务提交 → 参数化查询 → 双向验证」的顺序把每一步的可复制代码和验证动作都写清楚。你跟着敲一遍基本就能覆盖日常 90% 的 SQLite 操作。另外提一句如果你后面想把这类脚本接到大模型做数据分析、或者用 Claude Code 这类工具帮你生成和调试 SQL可以顺手了解下 TaoToken 的接入方式后面第 2 节会讲怎么配。先把本地数据库这块打牢再谈上层工具。2. TaoToken 前置准备给脚本接上模型能力如果你只是纯本地操作 SQLite其实不需要任何外部服务标准库就够了。但实际工作里经常有这样的需求让模型帮你根据自然语言生成 SQL、把查询结果丢给模型做总结、或者用 Claude Code 帮你重构数据库操作代码。这时候你需要一个稳定的模型调用入口。TaoToken 的定位就是统一的大模型 API 接入层官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的好处是你不用为每个模型单独申请 key、单独记 base_url一套配置就能切换不同模型。具体怎么拿 Key进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建一个新 key复制出来保存好。这个 key 就是你脚本里要填的凭证。如果你用的是 Claude Code 这类命令行编码工具它需要三件套Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiKey 填你刚创建的Model ID 按你实际要用的模型填。配置文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各客户端的详细步骤。想先试试模型对话效果可以直接用 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 这个页面不用写代码就能验证 key 是否可用。如果你打算长期用模型辅助编码、跑 Agent 任务Coding Plan 会更划算入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。这里要强调一点TaoToken 是模型 API 接入服务不是数据库工具它不会替代你本地的 sqlite3。你的数据始终在本地.db文件里模型只是帮你生成或分析 SQL 语句。两者是配合关系别搞混。3. 可复制配置建表与 CRUD 完整代码这一节是核心所有代码都能直接跑。我按「连接 → 建表 → 插入 → 查询 → 更新 → 删除」的顺序给每段都标了语言。先看最基础的连接和建表。注意sqlite3.connect()的参数是文件路径Windows 下用正斜杠或者双反斜杠都行import sqlite3 # 连接数据库文件不存在会自动创建 conn sqlite3.connect(demo.db) cursor conn.cursor() # 建表用户订单表 cursor.execute( CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_name TEXT NOT NULL, product TEXT NOT NULL, amount REAL NOT NULL, status TEXT DEFAULT pending, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) conn.commit() print(建表完成)这里几个点要注意INTEGER PRIMARY KEY AUTOINCREMENT是自增主键的标准写法TEXT存字符串REAL存浮点数DEFAULT CURRENT_TIMESTAMP会自动填当前时间。IF NOT EXISTS保证重复执行不会报错。接下来是插入数据。千万不要用字符串拼接一定用?占位符# 插入单条 cursor.execute( INSERT INTO orders (user_name, product, amount, status) VALUES (?, ?, ?, ?), (张三, 机械键盘, 399.0, paid) ) # 插入多条 data [ (李四, 显示器, 1299.0, pending), (王五, 鼠标垫, 29.9, paid), (赵六, 摄像头, 259.0, shipped), ] cursor.executemany( INSERT INTO orders (user_name, product, amount, status) VALUES (?, ?, ?, ?), data ) conn.commit() print(插入完成)executemany批量插入比循环单条快很多数据量大时差距明显。commit()必须调用否则数据只在内存里程序退出就没了。查询部分fetchall()拿全部fetchone()拿一条# 查询全部 cursor.execute(SELECT id, user_name, product, amount, status FROM orders) rows cursor.fetchall() for row in rows: print(row) # 条件查询 cursor.execute(SELECT * FROM orders WHERE status ?, (paid,)) paid_orders cursor.fetchall() print(f已支付订单数{len(paid_orders)}) # 聚合查询 cursor.execute(SELECT COUNT(*), SUM(amount) FROM orders) count, total cursor.fetchone() print(f共 {count} 笔订单总金额 {total})更新和删除同样用占位符# 更新 cursor.execute( UPDATE orders SET status ? WHERE id ?, (shipped, 1) ) # 删除 cursor.execute(DELETE FROM orders WHERE status ?, (pending,)) conn.commit() print(更新删除完成)最后别忘了关闭连接或者用with语句自动管理conn.close()用with的写法更安全异常时也会自动提交或回滚with sqlite3.connect(demo.db) as conn: cursor conn.cursor() cursor.execute(SELECT * FROM orders) print(cursor.fetchall())如果你要把这套脚本接到模型做 SQL 生成配置文件可以这样写以通用 JSON 为例{ base_url: https://taotoken.net/api, api_key: 你的key, model: 你的模型ID }把 base_url 和 key 填对模型就能帮你把「查出所有已支付订单的总金额」这种自然语言转成 SQL。4. 验证请求命令行与 Python 双向核对写完代码不算完你得确认数据真的落盘了。我习惯用两个方向交叉验证Python 脚本读一遍sqlite3 命令行再读一遍两边结果一致才放心。先看 Python 侧验证。写一个独立的查询脚本import sqlite3 def check_orders(db_pathdemo.db): conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute(SELECT COUNT(*) FROM orders) count cursor.fetchone()[0] cursor.execute(SELECT id, user_name, product, amount, status FROM orders LIMIT 5) samples cursor.fetchall() conn.close() print(f总记录数{count}) for s in samples: print(s) if __name__ __main__: check_orders()运行后你会看到类似输出总记录数3 (1, 张三, 机械键盘, 399.0, shipped) (2, 李四, 显示器, 1299.0, pending) (3, 王五, 鼠标垫, 29.9, paid)再用 sqlite3 命令行验证。Linux/macOS 直接终端输入sqlite3 demo.dbWindows 如果没装命令行工具可以用 Python 的交互模式代替。进入后sqlite .tables orders sqlite .schema orders CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, ... ); sqlite SELECT COUNT(*) FROM orders; 3 sqlite SELECT * FROM orders; 1|张三|机械键盘|399.0|shipped|2024-....tables看有哪些表.schema看表结构SELECT看数据。如果两边记录数和内容一致说明写入成功。还有一个常见验证场景确认commit()是否生效。你可以故意在插入后不 commit然后另开一个连接查询会发现查不到新数据。加上 commit 后再查就能看到。这个对比能帮你理解事务的边界。如果你用模型辅助生成了 SQL可以把生成的语句贴到命令行里跑一遍确认语法和结果都对再放回 Python 脚本。这样能避免模型偶尔生成的方言差异问题。5. 常见报错排查401、proxy、choices 与 OAuth这一节把实际会撞到的报错列出来对照着查。报错一sqlite3.OperationalError: no such table: orders原因通常是连接了错误的数据库文件或者建表语句没执行。检查connect()里的路径是不是你建表时用的那个。相对路径会相对于当前工作目录建议用绝对路径或者统一在项目根目录跑。报错二sqlite3.IntegrityError: NOT NULL constraint failed插入时某个NOT NULL字段传了 None。检查你的元组参数顺序和字段是否一一对应。用?占位符时参数顺序必须和字段顺序一致。报错三中文乱码或UnicodeDecodeErrorSQLite 默认用 UTF-8Python 3 的字符串也是 Unicode正常不会乱码。如果从 CSV 读进来乱码检查源文件编码读取时指定encodingutf-8或gbk。报错四调用模型接口时401 Unauthorized这是 key 的问题。检查 API Key 是否复制完整、有没有多余空格、是否已过期。TaoToken 的 key 在控制台 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理重新生成一个再试。报错五local proxy failed或连接超时这类通常是网络层问题。确认你的 base_url 填的是https://taotoken.net/api没有多余路径。如果你在公司内网检查是否需要配置网络出口。不要使用任何非官方的代理工具直接用官方地址即可。报错六reading choices相关解析错误这通常出现在模型返回结构和你代码预期不一致时。比如你按 OpenAI 格式解析response[choices][0][message][content]但实际返回结构不同。打印完整 response 看结构再调整取值路径。报错七OAuth 相关报错如果你用 Claude Code 或类似工具认证方式选错会报 OAuth 错误。这类工具应该用 API Key 方式Base URL 填https://taotoken.net/api不要走 OAuth 流程。配置文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里有各工具的认证方式说明。报错八database is locked多进程或多线程同时写同一个 db 文件会锁。SQLite 同一时刻只允许一个写操作。解决办法是串行化写入或者用 WAL 模式conn.execute(PRAGMA journal_modeWAL)。排查思路总结成一句先看报错类型数据库类错误查路径和 SQL接口类错误查 key 和 base_url结构类错误打印原始返回。6. 把 SQLite 脚本接到模型工作流本地数据库跑通之后你可以把它和模型能力串起来做更省事的事。比如写一个脚本读用户输入的自然语言 → 调模型生成 SQL → 在 SQLite 上执行 → 把结果返回给模型做总结。核心代码结构大概是这样import sqlite3 import requests def ask_model_to_sql(question, api_key, base_url, model): headers { Authorization: fBearer {api_key}, Content-Type: application/json } payload { model: model, messages: [ {role: system, content: 你是SQL生成助手只输出SQL语句不要解释。}, {role: user, content: f表结构orders(id, user_name, product, amount, status)。问题{question}} ] } resp requests.post(f{base_url}/v1/chat/completions, headersheaders, jsonpayload) return resp.json()[choices][0][message][content] def run_sql(sql, db_pathdemo.db): conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute(sql) result cursor.fetchall() conn.close() return result把 base_url 填https://taotoken.net/apikey 填你的model 填对应 ID就能跑通。想先验证模型对话是否正常用 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 这个页面测一下最直接。如果你长期要做这类「模型 本地数据」的脚本开发Coding Plan 比按次调用更省心入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它适合需要频繁调用模型做代码生成、调试、Agent 任务的场景。最后给你一个实用习惯每次改完数据库操作代码先跑一遍SELECT COUNT(*)确认记录数符合预期再跑业务查询。这个小动作能帮你快速定位是写入失败还是查询条件写错。数据库这东西验证永远比猜测靠谱。