M310ct's blog

轻量数据库的正确打开方式:Python x SQLite 教程

2025-06-09

 

0.为什么选择 Python + SQLite?

在开发一些轻量级的项目时,相比起安装 MySQL、PostgreSQL 等大型数据库系统,SQLite 提供了一个“零配置、文件级、嵌入式”的解决方案 —— 只需要一个 .db 文件就能开始操作数据库。

而在Python内置的sqlite3 模块让操作sqlite变得非常简单,无需额外以来就能执行SQL语句,管理表结构。

接下来我们就一步一步通过实际代码来看看,如何用 Python 玩转 SQLite。

1.连接数据库与创建数据库文件

文件数据库

import sqlite3
conn = sqlite3.connect("data.db")

内存数据库

import sqlite3
conn = sqlite3.connect(":memory:")

connect()的参数为:memory:,sqlite将不会创建文件而是将文件存储在内存中,程序退出后数据消失,因为没有IO操作所以速度更快,一般用于程序测试时

2.执行SQL命令

SQL 语句提交函数

cursor = conn.cursor()
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Bob",))
conn.commit()

SQL预处理

问号占位符

cursor.execute("SELECT * FROM users WHERE name = ?", ("Alice",))

命名占位符

cursor.execute("SELECT * FROM users WHERE name = :name", {"name": "Alice"})

非预期处理方式(风险写法❌)

name = "Alice"
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")

字符串拼接的写法会导致SQL注入漏洞

3.批量执行:executemany 的使用

data = [("Tom",), ("Jerry",), ("Spike",)]
cursor.executemany("INSERT INTO users (name) VALUES (?)", data)
conn.commit()

4. 获取查询结果

返回结果的三种函数

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
rows = cursor.fetchmany(n)
rows = cursor.fetchall()
conn.close()

查询结果作为字典

conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row["name"]) # 像访问字典一样取字段值

在默认情况下,SQLite 查询返回的是元组形式的结果

虽然能用,但你必须记得字段的顺序(row[1]name),代码可读性和健壮性都不高

设置conn.row_factory = sqlite3.Row 之后再执行查询时,返回的每一行就变成了一个可以通过字段名访问的对象

sqlite3.Row实际上是一个特殊对象,支持row["字段名"]

5.with自动管理连接

sqlite3.connect()返回的连接对象实现了上下文管理协议(即内部有__enter____exit__ 方法),因此可以用 with 语法自动管理连接的生命周期。

传统写法conn.close()可能会导致数据未提交,文件锁未释放,内存泄漏等问题,而用with则可以自动调用conn.commit()conn.close()

with sqlite3.connect("data.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

背后的原理

Python 的 with 语句本质是调用对象的这两个方法:

SQLite 的连接对象内置了这个行为。

6.总结

在本篇博客中,我们通过实际代码,介绍了如何用 Python 内置的 sqlite3 模块高效地操作 SQLite 数据库。你已经掌握了以下内容:

SQLite 是轻量、无依赖、嵌入式的理想选择,而 Python 则提供了简洁优雅的操作接口。两者结合,几乎可以应付所有小型项目、自动化脚本、离线工具、甚至 Web 后端的原型开发。

← Back to Home