Python 中的 sqlite3 模块:轻量级数据库的完美搭档

一、什么是 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 的典型流程如下:

  1. 连接数据库(创建连接对象)
  2. 创建游标(用于执行 SQL 命令)
  3. 执行 SQL 语句
  4. 提交事务(如果是写操作)
  5. 关闭连接

示例:创建表并插入数据

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'])  # 支持按列名访问

八、注意事项与最佳实践

  1. 总是使用参数化查询,避免 SQL 注入。

  2. 使用 with 语句管理连接,确保资源释放。

  3. 对于频繁操作,考虑开启 WAL 模式提升并发性能:

    python 复制代码
    cursor.execute('PRAGMA journal_mode=WAL')
  4. 不要共享连接对象跨线程,除非设置 check_same_thread=False 并自行管理同步。

  5. 大量数据操作后记得 commit()


九、适用场景

sqlite3 非常适合以下场景:

  • 小型 Web 应用的后端存储(如 Flask + SQLite)
  • 桌面应用程序配置或用户数据存储
  • 移动应用(Android/iOS 中也有 SQLite 支持)
  • 教学和原型开发
  • 日志记录、缓存等临时数据存储

不适合高并发、多写入的大型系统。


十、总结

Python 的 sqlite3 模块是一个强大而简洁的工具,让你无需复杂的数据库配置即可实现数据持久化。它结合了 SQL 的灵活性和 Python 的易用性,是学习数据库操作和快速开发的理想选择。


📌 参考资料

相关推荐
夜鸣笙笙6 小时前
交换最小值和最大值
python
2301_822363606 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
Leo.yuan6 小时前
经营分析会,该讲些什么?
大数据·数据库·数据分析
码界奇点6 小时前
基于Flask与OpenSSL的自签证书管理系统设计与实现
后端·python·flask·毕业设计·飞书·源代码管理
java1234_小锋6 小时前
分享一套优质的基于Python的房屋数据分析预测系统(scikit-learn机器学习+Flask)
python·数据分析·scikit-learn
CCPC不拿奖不改名6 小时前
RAG基础:基于LangChain 的文本分割实战+文本分块
人工智能·python·langchain·知识库·改行学it·rag·向量库
云飞扬7 小时前
浅谈数据访问层
数据库·bpm·数据库访问层
青春不朽5127 小时前
TensorFlow 入门指南
人工智能·python·tensorflow
bioinfomatic7 小时前
对比学习基本原理——以DrugClip为例,从CLIP到DrugClip
人工智能·python