SQLite 入门实战:从安装到常用 SQL 与 Python 集成
SQLite 是一款轻量、零配置的嵌入式关系型数据库,它把整个数据库存放在一个普通文件里,不需要单独的服务器进程,也不需要复杂的安装配置。正因为足够简单,它被广泛用在移动应用、桌面软件、物联网设备和本地开发测试中。本文用一个待办清单的例子,带你从安装开始,走完常用 SQL,再用 Python 把它真正用起来。
一、什么是 SQLite
SQLite 的核心特点可以概括为四点。第一,零配置:数据库就是一个文件,复制、备份、迁移都只需要操作这一个文件。第二,体积小、速度快:查询和写入都在进程内完成,没有网络开销,适合本地场景。第三,功能完整:支持事务、索引、视图、触发器和外键,SQL 语法与主流关系型数据库高度兼容。第四,跨平台:同一份数据库文件可以在 Windows、macOS、Linux 和移动端之间直接使用。
需要注意的是,SQLite 不是 MySQL 或 PostgreSQL 的替代品。它更适合单机、低并发、读写量适中的场景;如果是多人同时写入的高并发服务端,仍然应该选择服务器型数据库。
二、安装与验证
多数系统已经自带 SQLite。在终端输入以下命令查看版本:
sqlite3 --version
如果显示版本号,说明已经可用。如果提示命令不存在,可以到 SQLite 官网下载预编译的命令行工具,解压后把 sqlite3 加入系统路径即可。Python 标准库内置了 sqlite3 模块,不需要额外安装数据库软件就能直接写代码。
三、创建第一个数据库
进入 sqlite3 命令行,创建一个名为 todo.db 的数据库,并建一张任务表:
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
done INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
INSERT INTO tasks (title) VALUES ('阅读 SQLite 文档');
INSERT INTO tasks (title) VALUES ('写一个待办清单小工具');
SELECT * FROM tasks;
上面的表定义里,id 是自增主键,title 不能为空,done 用 0 和 1 表示未完成和已完成,created_at 用默认表达式记录创建时间。建表时把字段类型和约束一次想清楚,后面会少很多麻烦。
四、常用 SQL 一览
查询是最常用的操作,掌握下面几类就够日常使用。条件查询用 WHERE,排序用 ORDER BY,分页用 LIMIT 和 OFFSET:
SELECT id, title FROM tasks WHERE done = 0 ORDER BY id DESC LIMIT 10;
UPDATE tasks SET done = 1 WHERE id = 1;
DELETE FROM tasks WHERE id = 2;
统计类需求可以用聚合函数,例如统计未完成任务数:SELECT COUNT(*) FROM tasks WHERE done = 0。需要按状态分组时用 GROUP BY。多表关联时用 JOIN,例如把任务表和分类表按分类编号关联,再按分类统计数量。写 SQL 时先想清楚要什么结果,再决定用哪些子句,避免把所有逻辑都堆到一条语句里。
五、用 Python 集成 SQLite
Python 的 sqlite3 模块让数据库操作变得很直观。下面这段代码创建连接、插入数据并查询:
import sqlite3
conn = sqlite3.connect('todo.db')
conn.execute('INSERT INTO tasks (title) VALUES (?)', ('学习索引的用法',))
conn.commit()
rows = conn.execute('SELECT id, title FROM tasks WHERE done = 0').fetchall()
for task_id, title in rows:
print(task_id, title)
conn.close()
这里有三个要点。第一,参数用问号占位符传入,既能避免 SQL 注入,也能正确处理引号和特殊字符。第二,写入后要调用 commit 提交,否则数据不会落盘。第三,使用完毕后关闭连接,避免文件被长期占用。需要返回字典而不是元组时,可以设置 conn.row_factory = sqlite3.Row。
六、事务、索引与性能
SQLite 默认每条写入都是一个事务,批量写入时把多条语句放在同一个事务里,速度会快很多。做法很简单:在循环外开启事务,循环结束后再统一提交。经常按某一列查询时,可以给它建索引:CREATE INDEX idx_tasks_done ON tasks(done)。索引能显著加快查询,但也会让写入稍慢,建索引前先确认查询模式。
另外要记住:SQLite 在同一时刻只允许一个写入者,多个进程同时写会互相等待。设计程序时尽量缩短事务时间,读操作和写操作不要互相阻塞。
七、常见问题
初学者常遇到三个问题。一是数据库文件找不到:相对路径取决于程序当前工作目录,建议用绝对路径或在程序启动时打印出来确认。二是忘记提交:执行 INSERT 后没有 commit,关闭连接后数据就丢了。三是表被锁住:上一个连接没有关闭就反复打开新连接,先检查并关闭闲置连接。遇到报错时,先读报错信息里的表名和字段名,多数问题都能快速定位。
八、小结
SQLite 的学习路径很清晰:先理解一个文件就是一个数据库,再练习建表、增删改查,然后用 Python 的 sqlite3 模块把数据库接到自己的程序里,最后根据实际查询加上事务和索引。建议你亲手把本文的例子跑一遍,再给待办清单加一个分类表,练习一次 JOIN 查询。做完这个小项目,日常开发中遇到本地存储需求时,SQLite 往往就是最合适的第一选择。
- 点赞
- 收藏
- 关注作者
评论(0)