十分想念顺店杂可。。。

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.pswp.cn/diannao/95495.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95495.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95495.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖

用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖在企业经营分析中,光看一堆财务数字很难直观发现规律和问题。 如果能将这些数据转化为可视化图表,不仅更美观,还能帮助管理层快速做出决策。今天,我就用 Py…

一次 Unity ↔ Android 基于 RSA‑OAEP 的互通踩坑记

这篇分享,记录我如何从“Base64 报错/平台不支持/解密失败”一路定位到“填充算法不一致”的根因,并给出两条稳定落地方案。同时整理了调试手册、代码片段和上线前自检清单,方便你复用。 背景 Unity 端用公钥加密一段紧凑 JSON(i…

Go语言GC机制:高效并发回收解析

Go 语言的垃圾回收(Garbage Collection,简称 GC)是其自动内存管理的核心机制,旨在自动识别并回收不再被使用的内存,避免内存泄漏,减轻开发者的手动内存管理负担。Go 的 GC 算法经历了多次迭代优化&#xff…

imx6ull-驱动开发篇23——Linux 内核定时器实验

目录 实验程序编写 修改设备树文件 定时器驱动程序 timer.c 测试 timerApp.c Makefile 文件 运行测试 实验程序编写 本讲实验,我们使用正点原子I.MX6U-ALPHA 开发板,通过linux内核定时器周期性的点亮和熄灭开发板上的 LED 灯, LED 灯…

IPTV系统:开启视听与管理的全新篇章

在当今数字化飞速发展的时代,IPTV系统正以前所未有的姿态,重塑着我们的视听体验与管理模式。它不仅仅是一套技术系统,更是连接信息、沟通情感、提升效率的桥梁,为各个领域带来了全新的变革与发展机遇。从电视直播的角度来看&#…

PyTorch笔记9----------Cifar10图像分类

1.图像分类网络模型框架解读 分类网络的基本结构 数据加载模块:对训练数据加载数据重组:组合成网络需要的形式,例如预处理、增强、各种网络处理、loss函数计算优化器 数据加载模块 使用公开数据集:torchvision.datasets使用自定义…

飞凌OK3568开发板QT应用程序编译流程

飞凌OK3568开发板QT应用程序编译流程开发环境:ubuntu20.04(主机)、飞凌OK3568开发板一般在linux系统下开发用于ARM开发板的QT应用程序时,直接在主机上开发然后进行交叉编译即可,但有时候ARM开发板的厂家提供的SDK中可能…

飞算JavaAI合并项目实战:7天完成3年遗留系统重构

引言 企业数字化进程中,遗留系统改造始终是CIO面临的头号难题。某电商平台的实践数据显示:3年以上的Java项目平均存在47%的冗余代码,63%的架构设计不符合当前业务需求,进行系统性重构需要投入相当于原开发量200%的资源。传统&quo…

卫星速度增量和比冲及推力之间的关系

一、定义1.1.比冲(Isp):比冲是衡量发动机性能的重要指标,反映了单位重量推进剂在发动机中产生的冲量,单位为米/秒(m/s),代表燃料燃烧时喷流速度。这个单位与速度单位“米/秒”相同&a…

MATLAB绘制各种心形曲线

1.方程(1)心形线的经典隐函数方程为:(2)参数方程(更平滑的心形):(3)极坐标心形线(4)参数方程(3D心形)(5)隐函数3D心形2. MATLAB代码clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn…

Django REST Framework视图

Django REST Framework (DRF) 视图类详解DRF 提供了丰富的视图类来构建 API,从基础到高级,满足不同复杂度的需求。以下是 DRF 的主要视图类及其使用场景:1. 基础视图类APIView所有 DRF 视图的基类,相当于 Django 的 View 类的增强…

Linux面试题及详细答案 120道(1-15)-- 基础概念

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

week1-[分支结构]中位数

week1-[分支结构]中位数 题目描述 给定 444 个正整数 a,b,c,da,b,c,da,b,c,d,输出它们的中位数,答案四舍五入保留 111 位小数。 输入格式 输入共 111 行 444 个正整数 a,b,c,da,b,c,da,b,c,d。 输出格式 输出共 111 行 111 个浮点数表示答案。 样例 #1 样…

[激光原理与应用-259]:理论 - 几何光学 - 平面镜的反射、平面透镜的折射、平面镜的反射成像、平面透镜的成像的规律

一、平面镜的反射规律平面镜的反射遵循镜面反射定律,即光线在光滑表面(反射面平整度远大于波长)发生反射时,满足以下条件:反射光线、入射光线与法线共面:反射光线、入射光线和法线(垂直于反射面…

相机按键功能解析

相机按键功能解析佳能相机按键机身背面机身正面机身顶部机身侧面 佳能相机按键 机身背面取景器目镜:用于拍摄时观察相机形成的图像。实拍显示/视频拍摄按钮:按下即可开始拍摄或录制视频。光圈/曝光补偿键:调整光圈大小和曝光补偿,…

51单片机-驱动LED模块教程

本章思维导图: 51单片机驱动LED灯模块 LED灯元器件简介 LED(Light Emitting Diode,发光二极管) 是一种固态半导体器件,通过P-N结中电子与空穴复合直接将电能转化为光能。其核心结构由P型半导体(空穴主导&a…

Git 完全手册:从入门到团队协作实战(2)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

c语言中堆和栈的区别

1.栈区(stack):由编译器自动分配释放&#xff0c;栈主要用于存储局部变量、函数参数、函数调用和返回信息等。其操作方式类似于数据结构中的栈。 2.堆区(heap):一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;则可能会引起内存泄漏。注堆和数据结构中的堆栈不一样…

华为实验WLAN 基础配置随练

业务vlan 20 192.168.20.x管理vlan 100 192.168.100.x步骤① 网络互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

问题 在一个CMakeLists.txt文件里面看到了下面的这句话 find_package(Python2 COMPONENTS Interpreter Development NumPy)这个好有趣啊&#xff0c;Python2也是一个C的库吗&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …