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 的易用性,是学习数据库操作和快速开发的理想选择。


📌 参考资料

相关推荐
码农阿豪2 小时前
Redis键值对批量删除全攻略:安全高效删除包含特定模式的键
数据库·redis·安全
Logan Lie2 小时前
Go语言接口(interface)深度详解
开发语言·数据库·golang
半路_出家ren2 小时前
20.基于Selenium实现界面自动化控制
运维·python·selenium·测试工具·网络安全·自动化·chromedriver
计算机毕业设计指导2 小时前
恶意网址检测系统
python·web安全·网络安全·系统安全
短剑重铸之日2 小时前
《7天学会Redis》Day 7 - Redisson 全览
java·数据库·redis·后端·缓存·redission
一招定胜负2 小时前
模板匹配与银行卡号识别(预告)
python·opencv·计算机视觉
Access开发易登软件2 小时前
Access自动生成PPT报告完全指南
数据库·powerpoint·vba·vb·access·access开发
0和1的舞者2 小时前
《#{} vs ${}:MyBatis 里这俩符号,藏着性能与安全的 “生死局”》
java·数据库·学习·mybatis·intellij idea·mybatis操作
七夜zippoe2 小时前
实时数据处理:Kafka与Python构建高可靠流处理系统
分布式·python·kafka·集群·流处理·exactly-once