广告
您当前的位置: 首页 >  技术 >  Python

Python 深入浅出:用 sqlite3 模块快速搞定轻量级数据存储

作者:CoderWang 时间:2026-06-29 阅读数:5人阅读

在开发本地桌面应用、自动化运维工具、小型的爬虫系统,或者编写测试用例时,我们经常需要结构化的关系型数据库来存储数据。

然而,在这些轻量级场景下,去搭建并运维一个庞大的 MySQL 或 PostgreSQL 数据库服务器,无异于“杀鸡用牛刀”。

幸运的是,Python 标准库中开箱即用内置了 SQLite 数据库支持——sqlite3 模块。

SQLite 是一种无服务器(Serverless)的、基于单文件存储的关系型数据库。它无需安装、无需配置、性能优异,并且支持标准的 SQL-92 语法和完整的 ACID 事务特性。

本文将带您了解如何在 Python 中利用 sqlite3 模块进行轻量级数据库开发。


一、 快速上手:零配置与内存数据库

SQLite 既支持将数据持久化写入本地文件,也支持纯粹的内存数据库模式(:memory:,后者在程序运行期间全部驻留在内存中,读取速度快到飞起,且在程序退出时自动销毁,非常适合做临时缓存或单元测试桩。

import sqlite3

# 1. 连接到数据库。如果传入文件名,会自动在本地创建对应的 DB 文件
# 如果传入 ':memory:',则创建内存数据库
conn = sqlite3.connect(":memory:")

# 2. 创建游标(Cursor)对象,用于执行 SQL 语句
cursor = conn.cursor()

# 3. 创建一张简单的用户表
cursor.execute("""
    CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER
    )
""")

# 4. 提交更改并关闭连接
conn.commit()

二、 安全防线:参数化查询(预防 SQL 注入)

很多初学者喜欢使用 Python 字符串拼接来组装 SQL,例如: cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

这是极其危险的漏洞写法! 如果 user_input 包含了 ' OR '1'='1,黑客就能轻易窃取你的全表数据。

正确做法:使用占位符 ?

sqlite3 的执行器会自动对传入的参数进行安全转义,彻底杜绝 SQL 注入威胁:

# 推荐的安全写法:使用 ? 作为占位符,将参数以元组传入
user_name = "Alice"
cursor.execute("SELECT * FROM users WHERE name = ?", (user_name,))
row = cursor.fetchone()

三、 批量操作优化:executemany

如果你需要插入成千上万条记录,千万不要在循环里一遍又一遍地调用 execute("INSERT...")。这会导致硬盘进行数千次的频繁 IO 写入,速度极慢。

应该使用 executemany 进行批量绑定与提交:

users_data = [
    ("Bob", 20),
    ("Charlie", 28),
    ("David", 35)
]

# 一句话完成批量安全插入
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users_data)
conn.commit()

四、 优雅的事务管理器:使用 with 上下文

在进行多表关联写入时,我们必须保证“要么全部成功,要么全部失败(ACID 原则)”。

sqlite3 的连接对象(Connection)天然支持作为上下文管理器。with 块内部无异常运行结束时,事务会自动 commit;如果中途发生任何异常,事务会自动 rollback

try:
    # 将连接作为上下文管理器
    with conn:
        # 在此范围内的所有数据库写操作属于同一个事务
        cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Eve", 22))

        # 故意制造一个错误,触发事务回滚
        cursor.execute("INSERT INTO non_exist_table VALUES (1)")

except sqlite3.Error as e:
    print("❌ 数据库写入出错,事务已自动安全回滚!错误信息:", e)

五、 总结

  1. 轻量本地存储首选:对于单用户应用、本地工具、中间级缓存,直接用 sqlite3
  2. 防注入红线:永远使用 ? 占位符进行查询,严禁拼接 SQL 字符串。
  3. 善用内存模式:在单元测试中,使用 sqlite3.connect(':memory:') 可以带来极速的用例执行体验。

掌握 sqlite3 模块的底层应用,能够让您在面对复杂数据关系的存储需求时,无需依赖笨重的外部中间件,仅凭 Python 标准库就能构筑出稳健、高效的数据层解决方案!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信