一、什么是 SQLite?
SQLite 是一个 C 语言库,实现了自给自足、无服务器、零配置、事务性的 SQL 数据库引擎。它的主要特点包括:
- 轻量级:整个数据库存储在一个磁盘文件中。
- 无需安装:不需要单独的数据库服务器进程。
- 跨平台:支持 Windows、Linux、macOS 等主流操作系统。
- ACID 支持:保证原子性、一致性、隔离性和持久性。
- 广泛支持:被集成在 Python 标准库中,开箱即用。
二、Python 中的 sqlite3 模块
Python 从 2.5 版本开始内置了 sqlite3 模块(也称为 pysqlite),它为 SQLite 提供了 Python 接口。你可以直接通过 import sqlite3 来使用它,无需额外安装第三方包。
1. 导入模块
python
import sqlite3
三、基本操作流程
使用 sqlite3 的典型流程如下:
- 连接数据库(创建连接对象)
- 创建游标(用于执行 SQL 命令)
- 执行 SQL 语句
- 提交事务(如果是写操作)
- 关闭连接
示例:创建表并插入数据
python
import sqlite3
# 1. 连接到数据库(如果文件不存在会自动创建)
conn = sqlite3.connect('example.db')
# 2. 创建游标对象
cursor = conn.cursor()
# 3. 创建一张用户表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
# 4. 插入数据
cursor.execute('''
INSERT INTO users (name, age, email) VALUES (?, ?, ?)
''', ('Alice', 25, 'alice@example.com'))
# 5. 提交事务
conn.commit()
# 6. 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row)
# 7. 关闭连接
conn.close()
输出:
(1, 'Alice', 25, 'alice@example.com')
四、核心概念详解
1. 连接(Connection)
sqlite3.connect(database) 用于连接数据库。参数说明:
database:数据库文件路径。传入':memory:'可创建内存数据库(程序结束即消失)。- 其他可选参数如
timeout,check_same_thread等。
python
# 使用内存数据库
conn = sqlite3.connect(':memory:')
2. 游标(Cursor)
游标是执行 SQL 命令的对象。通过 conn.cursor() 创建。常用方法:
execute(sql, parameters):执行一条 SQL 语句。executemany(sql, seq_of_parameters):批量执行。fetchone():获取下一行结果。fetchall():获取所有结果。fetchmany(n):获取最多 n 行。
3. 参数化查询(防止 SQL 注入)
强烈建议使用参数化查询,而不是字符串拼接。例如:
✅ 正确做法(推荐):
python
cursor.execute("SELECT * FROM users WHERE age > ?", (18,))
❌ 危险做法(避免):
python
age = 18
cursor.execute(f"SELECT * FROM users WHERE age > {age}") # 可能导致 SQL 注入
五、常见操作示例
1. 批量插入数据
python
users = [
('Bob', 30, 'bob@example.com'),
('Charlie', 35, 'charlie@example.com'),
('Diana', 28, 'diana@example.com')
]
cursor.executemany('INSERT INTO users (name, age, email) VALUES (?, ?, ?)', users)
conn.commit()
2. 更新数据
python
cursor.execute('UPDATE users SET age = ? WHERE name = ?', (26, 'Alice'))
conn.commit()
3. 删除数据
python
cursor.execute('DELETE FROM users WHERE name = ?', ('Bob',))
conn.commit()
4. 查询数据(带条件)
python
cursor.execute('SELECT name, email FROM users WHERE age > ?', (30,))
results = cursor.fetchall()
for name, email in results:
print(f'{name}: {email}')
六、使用上下文管理器(推荐方式)
为了确保连接和游标正确关闭,推荐使用 with 语句:
python
import sqlite3
try:
with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute('INSERT INTO users (name, age, email) VALUES (?, ?, ?)',
('Eve', 22, 'eve@example.com'))
# 自动提交(成功时),出错则回滚
except sqlite3.DatabaseError as e:
print(f"数据库错误: {e}")
注意:使用
with时,只有在没有异常的情况下才会自动提交。如果有异常,会自动回滚。
七、高级功能
1. 自定义函数
你可以在 SQLite 中注册 Python 函数:
python
def uppercase(text):
return text.upper()
conn.create_function('UPPERCASE', 1, uppercase)
cursor.execute("SELECT UPPERCASE(name) FROM users")
print(cursor.fetchall()) # [('ALICE',), ...]
2. 行工厂(Row Factory)
默认返回元组,但可以通过 row_factory 返回字典风格的结果:
python
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute('SELECT * FROM users LIMIT 1')
row = cursor.fetchone()
print(row['name'], row['email']) # 支持按列名访问
八、注意事项与最佳实践
-
总是使用参数化查询,避免 SQL 注入。
-
使用
with语句管理连接,确保资源释放。 -
对于频繁操作,考虑开启 WAL 模式提升并发性能:
pythoncursor.execute('PRAGMA journal_mode=WAL') -
不要共享连接对象跨线程,除非设置
check_same_thread=False并自行管理同步。 -
大量数据操作后记得
commit()。
九、适用场景
sqlite3 非常适合以下场景:
- 小型 Web 应用的后端存储(如 Flask + SQLite)
- 桌面应用程序配置或用户数据存储
- 移动应用(Android/iOS 中也有 SQLite 支持)
- 教学和原型开发
- 日志记录、缓存等临时数据存储
不适合高并发、多写入的大型系统。
十、总结
Python 的 sqlite3 模块是一个强大而简洁的工具,让你无需复杂的数据库配置即可实现数据持久化。它结合了 SQL 的灵活性和 Python 的易用性,是学习数据库操作和快速开发的理想选择。
📌 参考资料: