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

python sqlite3模块

十分想念顺店杂可。。。

Python 的sqlite3模块是标准库中用于操作SQLite 数据库的工具。SQLite 是一款轻量级嵌入式数据库(无需独立服务器,数据存储在单一文件中),适合小型应用、本地数据存储或原型开发。sqlite3模块提供了完整的 SQLite 操作接口,支持标准 SQL 语法。

一、核心概念

  • 数据库文件:SQLite 数据存储在单一文件中(如data.db),无需单独部署服务器。
  • 连接(Connection):通过sqlite3.connect()创建与数据库文件的连接。
  • 游标(Cursor):通过连接获取游标对象,用于执行 SQL 语句和获取结果。
  • 事务:默认自动提交(autocommit=False时需手动提交),支持commit()提交和rollback()回滚。

二、基本用法

1. 连接数据库

使用sqlite3.connect()创建连接,若指定文件不存在则自动创建。

import sqlite3# 连接数据库(文件不存在则创建)
conn = sqlite3.connect('test.db')  # 数据库文件名为test.db# 获取游标(用于执行SQL语句)
cursor = conn.cursor()

2. 创建表(CREATE TABLE)

通过游标执行CREATE TABLE语句创建表,需指定表名和字段(SQLite 支持动态类型,常用类型:INTEGERTEXTREALBLOB)。

# 创建用户表(id为主键自增,name为文本,age为整数)
create_sql = '''
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,email TEXT UNIQUE  # email唯一
)
'''
cursor.execute(create_sql)# 提交事务(创建表属于 schema 变更,需提交)
conn.commit()

  • IF NOT EXISTS:避免表已存在时报错。
  • PRIMARY KEY AUTOINCREMENT:id 字段自动增长,作为唯一标识。

3. 插入数据(INSERT)

使用INSERT语句插入数据,推荐用参数化查询?作为占位符),避免 SQL 注入。

# 插入单条数据
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
cursor.execute(insert_sql, ('Alice', 25, 'alice@example.com'))  # 参数以元组传入# 插入多条数据( executemany 批量插入)
users = [('Bob', 30, 'bob@example.com'),('Charlie', 35, 'charlie@example.com')
]
cursor.executemany(insert_sql, users)  # 第二个参数为可迭代对象# 提交事务(插入/更新/删除操作需提交才生效)
conn.commit()

4. 查询数据(SELECT)

通过SELECT语句查询数据,使用fetchone()fetchmany(n)fetchall()获取结果。

# 1. 查询所有数据
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall()  # 获取所有结果(列表嵌套元组)
print("所有用户:", all_users)
# 输出:[(1, 'Alice', 25, 'alice@example.com'), (2, 'Bob', 30, 'bob@example.com'), ...]# 2. 查询单条数据(按条件)
cursor.execute("SELECT name, age FROM users WHERE age > ?", (28,))
user = cursor.fetchone()  # 获取第一条结果(元组)
print("年龄>28的第一个用户:", user)  # 输出:('Bob', 30)# 3. 查询部分数据(限制条数)
cursor.execute("SELECT * FROM users ORDER BY age DESC")
top2 = cursor.fetchmany(2)  # 获取前2条结果
print("年龄最大的2个用户:", top2)

5. 更新数据(UPDATE)

使用UPDATE语句修改数据,同样支持参数化查询。

# 更新Alice的年龄为26
update_sql = "UPDATE users SET age = ? WHERE name = ?"
cursor.execute(update_sql, (26, 'Alice'))
conn.commit()  # 提交修改# 验证更新结果
cursor.execute("SELECT age FROM users WHERE name = 'Alice'")
print("Alice的新年龄:", cursor.fetchone()[0])  # 输出:26

6. 删除数据(DELETE)

使用DELETE语句删除数据,注意条件判断避免误删。

# 删除邮箱为charlie@example.com的用户
delete_sql = "DELETE FROM users WHERE email = ?"
cursor.execute(delete_sql, ('charlie@example.com',))
conn.commit()# 验证删除结果
cursor.execute("SELECT * FROM users WHERE email = 'charlie@example.com'")
print("删除后是否存在:", cursor.fetchone())  # 输出:None(表示不存在)

7. 关闭连接

操作完成后,需关闭游标和连接释放资源。

# 关闭游标
cursor.close()# 关闭连接
conn.close()

三、高级特性

1. 事务处理

SQLite 默认开启事务(autocommit=False),多个操作需手动commit()提交;若中间出错,可rollback()回滚。

try:# 开启事务(默认已开启)cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Dave', 40))cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Eve', '30'))  # 错误:age应为整数# 若全部成功,提交事务conn.commit()
except sqlite3.Error as e:# 出错时回滚(撤销所有未提交操作)conn.rollback()print(f"事务失败,已回滚:{e}")
finally:cursor.close()conn.close()

2. 上下文管理器(with 语句)

使用with语句自动管理连接和游标,无需手动关闭。

# 连接作为上下文管理器:自动提交或回滚(出错时)
with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor:  # 游标作为上下文管理器# 执行查询cursor.execute("SELECT name FROM users")print("用户列表:", [row[0] for row in cursor.fetchall()])
# 退出with块后,连接和游标自动关闭

3. 行工厂(Row Factory)

设置conn.row_factory = sqlite3.Row,使查询结果可通过字段名访问(类似字典)。

conn = sqlite3.connect('test.db')
conn.row_factory = sqlite3.Row  # 启用行工厂
cursor = conn.cursor()cursor.execute("SELECT * FROM users WHERE name = 'Alice'")
user = cursor.fetchone()# 可通过索引或字段名访问
print("ID:", user[0])         # 索引访问
print("姓名:", user['name'])  # 字段名访问(更直观)
print("年龄:", user['age'])cursor.close()
conn.close()

4. 执行 SQL 脚本

通过executescript()执行多条 SQL 语句(以分号分隔)。

with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor:# 执行批量SQL(创建表+插入数据)script = '''CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT);INSERT INTO products (name) VALUES ('Laptop');INSERT INTO products (name) VALUES ('Phone');'''cursor.executescript(script)conn.commit()

四、常见错误与注意事项

  1. SQL 注入风险
    禁止用字符串拼接构造 SQL(如f"INSERT INTO users VALUES ({name})"),必须用参数化查询(?占位符)。

  2. 数据类型
    SQLite 是动态类型,字段类型声明仅为建议(如INTEGER字段可存入字符串),需在应用层保证类型正确。

  3. 并发写入
    SQLite 适合单线程或低并发场景,高并发写入可能导致锁表(同一时间仅允许一个写操作)。

  4. 事务未提交
    插入 / 更新 / 删除后未调用commit(),数据不会写入数据库(仅在内存中临时存在)。

  5. 表已存在
    创建表时添加IF NOT EXISTS,避免table already exists错误。

五、适用场景

  • 小型应用或工具(如本地配置存储、日志记录);
  • 原型开发(快速搭建,无需部署数据库服务器);
  • 嵌入式设备(资源有限,无需独立数据库进程);
  • 测试环境(轻量、易部署)。

总结

sqlite3模块提供了简洁的接口操作 SQLite 数据库,核心流程为:
连接数据库 → 获取游标 → 执行 SQL → 处理结果 → 提交事务 → 关闭连接
通过参数化查询、事务管理和上下文管理器,可安全高效地实现本地数据存储,是轻量级场景的理想选择。

http://www.lryc.cn/news/620435.html

相关文章:

  • 高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol
  • 《贵州棒球百科》体育赛事排名·棒球1号位
  • 视频号主页的企业信息如何设置?
  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • 从理论到落地:分布式事务全解析(原理 + 方案 + 避坑指南)
  • 云原生存储架构设计与性能优化
  • 【java实现一个接口多个实现类通用策略模式】
  • GitHub 仓库代码上传指南
  • Python包性能优化与并发编程:构建高性能应用的核心技术(续)
  • OpenBMC中C++策略模式架构、原理与应用
  • Qt基本控件
  • Elasticsearch:如何使用 Qwen3 来做向量搜索
  • 设计模式-策略模式 Java
  • 设计模式基础概念(行为模式):策略模式
  • Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)
  • LeetCode 刷题【41. 缺失的第一个正数】
  • linux 主机驱动(SPI)与外设驱动分离的设计思想
  • tomcat 定时重启
  • LeetCode 1780:判断一个数字是否可以表示成3的幂的和-进制转换解法
  • 【Java虚拟机】JVM相关面试题
  • 网页加载缓慢系统排查与优化指南
  • pnpm常用命令;为什么使用pnpm?
  • 【STM32入门教程】stm32简介
  • Day56--图论--108. 冗余的边(卡码网),109. 冗余的边II(卡码网)
  • QLab Pro for Mac —— 专业现场音频与多媒体控制软件
  • 【BFS】P9065 [yLOI2023] 云梦谣|普及+
  • Spark Shuffle机制原理
  • 云蝠智能 VoiceAgent:重构物流售后场景的智能化引擎
  • 标贝科技「十万音色·自然语音数据集」 重构AI语音训练基础设施
  • 基于vue.js的无缝滚动