SQLite – Python(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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 数据库应用了!

最新发布