当前位置: 首页 > news >正文

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

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

一、什么是 SQLite?

SQLite 是一个 C 语言库,实现了自给自足、无服务器、零配置、事务性的 SQL 数据库引擎。它的主要特点包括:

  • 轻量级:整个数据库存储在一个磁盘文件中。
  • 无需安装:不需要单独的数据库服务器进程。
  • 跨平台:支持 Windows、Linux、macOS 等主流操作系统。
  • ACID 支持:保证原子性、一致性、隔离性和持久性。
  • 广泛支持:被集成在 Python 标准库中,开箱即用。

二、Python 中的 sqlite3 模块

Python 从 2.5 版本开始内置了 sqlite3 模块(也称为 pysqlite),它为 SQLite 提供了 Python 接口。你可以直接通过 import sqlite3 来使用它,无需额外安装第三方包。

1. 导入模块

import sqlite3


三、基本操作流程

使用 sqlite3 的典型流程如下:

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

示例:创建表并插入数据

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:' 可创建内存数据库(程序结束即消失)。
  • 其他可选参数如 timeoutcheck_same_thread 等。
# 使用内存数据库
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 注入)

强烈建议使用参数化查询,而不是字符串拼接。例如:

✅ 正确做法(推荐):

cursor.execute("SELECT * FROM users WHERE age > ?", (18,))

❌ 危险做法(避免):

age = 18
cursor.execute(f"SELECT * FROM users WHERE age > {age}")  # 可能导致 SQL 注入


五、常见操作示例

1. 批量插入数据

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. 更新数据

cursor.execute('UPDATE users SET age = ? WHERE name = ?', (26, 'Alice'))
conn.commit()

3. 删除数据

cursor.execute('DELETE FROM users WHERE name = ?', ('Bob',))
conn.commit()

4. 查询数据(带条件)

cursor.execute('SELECT name, email FROM users WHERE age > ?', (30,))
results = cursor.fetchall()
for name, email in results:print(f'{name}: {email}')


六、使用上下文管理器(推荐方式)

为了确保连接和游标正确关闭,推荐使用 with 语句:

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 函数:

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 返回字典风格的结果:

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 模式提升并发性能:
    cursor.execute('PRAGMA journal_mode=WAL')

  4. 不要共享连接对象跨线程,除非设置 check_same_thread=False 并自行管理同步。
  5. 大量数据操作后记得 commit()

九、适用场景

sqlite3 非常适合以下场景:

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

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


十、总结

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


 参考资料

  • Python 官方文档 - sqlite3
  • SQLite 官网
http://www.jsqmd.com/news/377535/

相关文章:

  • 基于C#实现视频文件解封装与媒体流读取方案
  • 野外在线雷达雨量水位监测站
  • AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 426
  • 解锁 Claude 高效用法:代码分析、调试与重构实战指南
  • 盒马鲜生卡的使用范围与回收流程解析 - 团团收购物卡回收
  • 需求管理系统哪个好?2026年需求管理系统推荐与排名,解决扩展性与安全核心痛点 - 十大品牌推荐
  • 上海智推时代GEO合作:企业正规对接渠道一键收藏 - 速递信息
  • 春节适合全家人一起观看的电影:我为什么更推荐《惊蛰无声》,以及口碑怎么看 - SFMEDIA
  • 苹果充值卡回收变现实用攻略,让闲置卡片秒变现金! - 团团收购物卡回收
  • 用react server action调用go语言后端
  • 红杉中国领投数亿元融资,觅蜂科技打造具身智能数据基础设施
  • 电影《惊蛰无声》全解析:春节档怎么选、口碑怎么判断、全家/爸妈/朋友三种观影场景我会怎么安排 - SFMEDIA
  • 瑞祥卡兑换现金超简单,这些方法你知道吗? - 团团收购物卡回收
  • 2026售楼处商用咖啡机推荐 适配商务接待 高效稳定易运维 - 品牌2025
  • 基于Spring Boot的“味蕾探索”线上零食购物平台的设计与搭建(源码+论文+部署+安装)
  • 2026奶茶店智能咖啡机推荐 商用高效稳定机型精选 适配高出杯量需求 - 品牌2025
  • 在银川搬家,选哪家公司?尖兵搬家,本地正规搬家公司,拆卸、搬运、安装 一站式服务 - 宁夏壹山网络
  • 商务对接智推时代GEO:2026官方联系方式全公开 - 速递信息
  • flinkcdc 从mysql到hudi
  • c# scrollerview滚动到指定元素位置
  • 类似Jira的软件哪个好?2026年类似Jira的软件推荐与排名,解决定制化与数据迁移核心痛点 - 十大品牌推荐
  • 赶deadline必备!千笔·专业论文写作工具,本科生专属AI论文网站
  • 2026咖啡连锁全自动咖啡机推荐 商用高效稳定机型精选 适配多场景 - 品牌2025
  • (11-4-03)完整人形机器人的设计与实现案例:盲踩障碍物
  • 2026冲刺用!千笔·降AI率助手,标杆级的降AIGC平台
  • 个人思考3——世界动作模型
  • 《卷2:人形机器人的环境感知与多模态融合》
  • 详细介绍:39M参数撬动百亿市场:Whisper-Tiny.en引领嵌入式语音交互革命
  • vue3的组件间通信ref子组件需要把父组件要的ref数据开放
  • 春节档电影推荐与口碑讨论:我为什么把《惊蛰无声》列进“全家都能看”的优先清单 - SFMEDIA