SQLite – Python(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在编程世界中,数据库与编程语言的搭配如同钥匙与锁的关系。SQLite 与 Python 的组合,因其轻量、高效、易用的特点,成为许多开发者的首选。对于编程初学者而言,SQLite 的无服务端架构避免了复杂的配置流程;而 Python 的简洁语法则降低了代码编写门槛。这对组合不仅适合快速原型开发,还能为中级开发者提供深入数据库管理的实战机会。接下来,我们将通过循序渐进的方式,探索如何用 Python 操控 SQLite 数据库。
一、环境准备:搭建 SQLite – Python 开发环境
1.1 安装 SQLite
SQLite 是一个嵌入式数据库引擎,通常无需额外安装。大多数操作系统(如 macOS、Linux)和 Python 环境默认已包含 SQLite 库。若需手动安装,可通过系统包管理器或下载官方二进制文件完成。
1.2 Python 的 SQLite 接口
Python 标准库中的 sqlite3
模块提供了与 SQLite 数据库交互的接口。无需额外安装,只需在代码中导入该模块即可:
import sqlite3
1.3 验证环境
通过简单的代码片段验证环境是否就绪:
import sqlite3
try:
conn = sqlite3.connect(':memory:') # 创建内存数据库
print("SQLite 连接成功!")
except Exception as e:
print(f"连接失败:{str(e)}")
二、基础操作:从连接到查询的全流程
2.1 连接数据库
使用 connect()
方法创建数据库连接。若指定的文件不存在,SQLite 会自动创建新文件:
conn = sqlite3.connect('my_database.db')
2.2 创建表结构
数据库表的设计如同图书馆的书架分类。例如,创建一个存储书籍信息的表:
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author TEXT,
published_year INTEGER
)
''')
2.3 插入数据
向表中插入数据时,需使用参数化查询避免 SQL 注入风险:
book = ('1984', 'George Orwell', 1949)
cursor.execute("INSERT INTO books (title, author, published_year) VALUES (?, ?, ?)", book)
conn.commit() # 提交事务
2.4 查询数据
使用 SELECT
语句检索数据,并通过 fetchall()
方法获取结果:
cursor.execute("SELECT * FROM books WHERE published_year > 1950")
rows = cursor.fetchall()
for row in rows:
print(row)
三、进阶技巧:事务、游标与复杂查询
3.1 事务管理
事务确保数据操作的原子性。例如,在批量插入数据时使用事务可提高效率:
try:
conn.execute("BEGIN TRANSACTION")
# 执行多个插入操作
conn.execute("INSERT INTO books ...")
conn.execute("INSERT INTO authors ...")
conn.commit() # 成功则提交
except:
conn.rollback() # 失败则回滚
3.2 游标对象详解
游标(Cursor)是数据库操作的“指针”,控制查询结果的遍历方式:
cursor = conn.cursor()
cursor.execute("SELECT * FROM books")
while True:
row = cursor.fetchone()
if row is None:
break
print(row)
3.3 复杂查询示例
通过 JOIN 操作关联多个表,例如统计作者的著作数量:
cursor.execute('''
SELECT authors.name, COUNT(books.id)
FROM authors
LEFT JOIN books ON authors.id = books.author_id
GROUP BY authors.name
''')
四、实战案例:构建学生管理系统
4.1 需求分析
构建一个简单的学生成绩管理系统,需包含以下功能:
- 创建学生表和成绩表
- 添加学生信息
- 查询学生成绩
- 统计班级平均分
4.2 数据库设计
cursor.execute('''
CREATE TABLE students (
student_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)
''')
cursor.execute('''
CREATE TABLE scores (
id INTEGER PRIMARY KEY AUTOINCREMENT,
student_id TEXT,
subject TEXT,
score REAL,
FOREIGN KEY (student_id) REFERENCES students(student_id)
)
''')
4.3 功能实现
添加学生信息
def add_student(student_id, name, age):
cursor.execute(
"INSERT INTO students VALUES (?, ?, ?)",
(student_id, name, age)
)
conn.commit()
查询学生成绩
def get_student_scores(student_id):
cursor.execute('''
SELECT subject, score
FROM scores
WHERE student_id = ?
''', (student_id,))
return cursor.fetchall()
统计班级平均分
def calculate_class_avg():
cursor.execute('''
SELECT AVG(score)
FROM scores
WHERE subject = 'Math'
''')
return cursor.fetchone()[0]
五、性能优化与高级主题
5.1 索引优化
为高频查询字段添加索引,可显著提升查询速度:
cursor.execute("CREATE INDEX idx_student_id ON scores (student_id)")
5.2 参数化查询防 SQL 注入
通过 ?
占位符避免直接拼接 SQL 语句:
user_input = "'; DROP TABLE students; --" # 恶意输入
cursor.execute("SELECT * FROM students WHERE name = ?", (user_input,)) # 安全执行
5.3 数据库连接池
对于高并发场景,使用 sqlite3
的连接池技术可提升性能:
from sqlite3 import connect
六、常见问题与解决方案
6.1 错误:sqlite3.OperationalError
当遇到表不存在的错误时,需检查:
- SQL 语句的拼写(如
SELECT
错写为SELCT
) - 表名是否区分大小写(默认 SQLite 是不区分的)
- 数据库文件路径是否正确
6.2 数据库锁问题
在多线程环境中,使用 BEGIN IMMEDIATE
替代默认的 BEGIN
可减少锁竞争:
cursor.execute("BEGIN IMMEDIATE")
结论:掌握 SQLite – Python 的价值
通过本文的学习,读者已掌握了从基础操作到实战应用的全套技能。SQLite 与 Python 的组合不仅适合快速开发小型应用,其轻量特性还使其成为学习数据库原理的理想工具。对于初学者,建议从简单项目入手(如待办事项列表)逐步进阶;中级开发者则可尝试结合 ORM 框架(如 SQLAlchemy)探索更复杂的场景。记住,最好的学习方式是动手实践——现在,是时候打开你的编辑器,开始构建第一个 SQLite 数据库应用了!