当前位置: 首页 > 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.dtcms.com/a/330909.html

相关文章:

  • iOS App TF上架全流程实战 高效内测分发与IPA包管理
  • 【KALI】第一篇 安装Kali Linux虚拟机之详细操作步骤讲解
  • Elasticsearch RBAC 配置:打造多租户环境的安全访问控制
  • 一篇文章读懂.Net的依赖注入
  • 应用银行卡识别技术,构建更安全、便捷的数字身份认证与支付生态
  • LeetCode hot 100 day1
  • springboot+vue实现通过poi完成excel
  • 云计算-多服务集群部署实战指南:从JumpServer到Kafka、ZooKeeper 集群部署实操流程
  • MySQL流程处理函数
  • 计算机视觉Open-CV
  • Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)
  • 力扣-1143.最长公共子序列
  • 【LeetCode 热题 100】295. 数据流的中位数——最大堆和最小堆
  • 前端开发如何优化 SEO:常见问题及解决方案全解析​
  • JMeter性能测试详细版(适合0基础小白学习--非常详细)
  • 简单好用的桌面时钟—— Digital Clock 4
  • 飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化
  • [Android] 二十四节气日历v1.0.3 - 弘扬传统文化,精致设计,无广告纯净体验!
  • 考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】
  • 双机热备实验
  • Linux编程1:进程和线程
  • DTW算法判断两条曲线的相似度,Python代码
  • [激光原理与应用-272]:理论 - 波动光学 - 单纯的白色其实并不单纯
  • 迅为RK3562开发板获取Android13源码
  • 3D商品展示:技术狂欢下的普及困局
  • 【新启航】起落架大型结构件深孔检测探究 - 激光频率梳 3D 轮廓检测
  • Uniapp 自定义头部导航栏
  • 表达式树实战:Unity动态逻辑编程
  • 考研408《计算机组成原理》复习笔记,第三章(6)——Cache(超级重点!!!)
  • 【科研绘图系列】R语言绘制蝶形条形图蝶形柱状堆积图