SQLite3模块使用详解

目录

一、引言

1.1 SQLite3 简介

1.2 Python sqlite3 模块

二、连接数据库

2.1 导入 sqlite3 模块

2.2 连接数据库

2.3 创建游标对象

三、执行 SQL 语句

3.1 创建表

3.2 插入数据

3.3 查询数据

3.4 更新数据

3.5 删除数据

四、处理查询结果

4.1 fetchall()

4.2 fetchone()

4.3 fetchmany(size)

五、关闭连接

六、注意事项

6.1 SQL 注入

6.2 事务管理

6.3 错误处理

七、案例:学生信息管理系统

7.1 数据库结构

7.2 功能实现

7.2.1 初始化数据库

7.2.2 插入学生信息

7.2.3 查询学生信息

7.2.4 更新学生信息

7.2.5 删除学生信息

八、总结


SQLite3 是一种轻量级的数据库引擎,它不需要独立的服务器进程,可以直接读写磁盘上的数据库文件。由于其简单易用和高效的特性,SQLite3 成为了许多应用程序和开发者在开发阶段的首选数据库。Python 的 sqlite3 模块提供了对 SQLite3 数据库的直接支持,允许开发者在 Python 环境中轻松地进行数据库操作。本文将详细讲解如何使用 Python 的 sqlite3 模块进行数据库的基本操作,包括连接数据库、执行 SQL 语句、处理查询结果等,并辅以丰富的代码和案例,帮助新手朋友快速入门。

一、引言

1.1 SQLite3 简介

SQLite3 是一种开源的嵌入式数据库管理系统,它实现了自包含的、高可靠的、具有完整事务处理的 SQL 数据库引擎。SQLite3 最大的特点是轻量级,无需配置、无需服务器即可运行,数据库文件直接存储在磁盘上,非常适合用于小型或中型应用程序,以及作为原型开发阶段的数据库。

1.2 Python sqlite3 模块

Python 的 sqlite3 模块提供了对 SQLite3 数据库的接口,使得 Python 开发者可以方便地执行 SQL 语句、管理数据库。该模块是 Python 的标准库之一,因此无需额外安装即可使用。

二、连接数据库

2.1 导入 sqlite3 模块

首先,需要导入 Python 的 sqlite3 模块。
import sqlite3

2.2 连接数据库

使用 sqlite3.connect() 方法可以连接到 SQLite3 数据库。如果指定的数据库文件不存在,SQLite 会自动创建一个新的数据库文件。

# 连接到SQLite数据库  
# 数据库文件是my_database.db,如果文件不存在,会自动在当前目录创建  
conn = sqlite3.connect('my_database.db')

2.3 创建游标对象

游标(Cursor)对象用于执行 SQL 语句并获取结果。通过连接对象的 cursor() 方法可以创建一个游标对象。

# 创建游标对象  
cursor = conn.cursor()

三、执行 SQL 语句

3.1 创建表

使用游标对象的 execute() 方法可以执行 SQL 语句。以下是一个创建表的示例:

# 创建表  
create_table_sql = """  
CREATE TABLE IF NOT EXISTS student (  id INTEGER PRIMARY KEY AUTOINCREMENT,  name TEXT NOT NULL,  age INTEGER NOT NULL  
);  
"""  
cursor.execute(create_table_sql)  # 提交事务  
conn.commit()

3.2 插入数据

插入数据同样使用 execute() 方法,并可以传入参数来避免 SQL 注入的风险。

# 插入单条数据  
insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  
cursor.execute(insert_sql, ('Alice', 20))  # 插入多条数据  
insert_many_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  
students = [('Bob', 22), ('Charlie', 23)]  
cursor.executemany(insert_many_sql, students)  # 提交事务  
conn.commit()

3.3 查询数据

查询数据后,可以使用游标对象的 fetchall()、fetchone() 或 fetchmany(size) 方法来获取查询结果。

# 查询所有数据  
query_sql = "SELECT * FROM student"  
cursor.execute(query_sql)  
results = cursor.fetchall()  for row in results:  print(row)  # 查询单条数据  
query_one_sql = "SELECT * FROM student WHERE id = 1"  
cursor.execute(query_one_sql)  
result = cursor.fetchone()  
print(result)

3.4 更新数据

更新数据同样使用 execute() 方法,并传入更新条件和新的数据值。

# 更新数据  
update_sql = "UPDATE student SET age = ? WHERE name = ?"  
cursor.execute(update_sql, (21, 'Alice'))  # 提交事务  
conn.commit()

3.5 删除数据

删除数据也使用 execute() 方法,并传入删除条件。

# 删除数据  
delete_sql = "DELETE FROM student WHERE name = ?"  
cursor.execute(delete_sql, ('Bob',))  # 提交事务  
conn.commit()

四、处理查询结果

4.1 fetchall()

fetchall() 方法返回查询结果的所有行,结果是一个元组的列表,每个元组代表一行数据。

# 查询并获取所有结果  
cursor.execute("SELECT * FROM student")  
rows = cursor.fetchall()  
for row in rows:  print(row)

4.2 fetchone()

fetchone() 方法返回查询结果的下一行,结果是一个元组,代表一行数据。如果所有行都已返回,则返回 None。

# 查询并获取单行结果  
cursor.execute("SELECT * FROM student WHERE id = 1")  
row = cursor.fetchone()  
print(row)

4.3 fetchmany(size)

fetchmany(size) 方法返回查询结果的下一组行,size 指定返回的行数。如果剩余的行数少于 size,则返回剩余的所有行。

# 查询并获取指定数量的结果  
cursor.execute("SELECT * FROM student")  
rows = cursor.fetchmany(2)  
for row in rows:  print(row)

五、关闭连接

操作完成后,应关闭游标和数据库连接,以释放资源。

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

六、注意事项

6.1 SQL 注入

使用 SQL 语句时,应避免将用户输入直接拼接到 SQL 语句中,以防止 SQL 注入攻击。可以通过使用参数化查询来避免这一问题。

6.2 事务管理

对于需要多条 SQL 语句协同完成的操作,应使用事务(Transaction)来保证数据的一致性。在 SQLite 中,可以通过 BEGIN TRANSACTION、COMMIT 和 ROLLBACK 语句来管理事务,但 Python 的 sqlite3 模块在调用 commit() 方法时会自动开始一个新的事务。

6.3 错误处理

在执行 SQL 语句时,可能会遇到各种错误,如语法错误、数据类型不匹配等。因此,在编写代码时,应加入适当的错误处理逻辑,以便在遇到错误时能够给出清晰的提示信息。

七、案例:学生信息管理系统

以下是一个简单的学生信息管理系统案例,展示了如何使用 sqlite3 模块进行数据库操作。

7.1 数据库结构

假设有一个名为 student_management.db 的数据库,其中包含一个名为 student 的表,表结构如下:

CREATE TABLE IF NOT EXISTS student (  id INTEGER PRIMARY KEY AUTOINCREMENT,  name TEXT NOT NULL,  age INTEGER NOT NULL  
);

7.2 功能实现

7.2.1 初始化数据库
def init_db(db_path):  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  create_table_sql = """  CREATE TABLE IF NOT EXISTS student (  id INTEGER PRIMARY KEY AUTOINCREMENT,  name TEXT NOT NULL,  age INTEGER NOT NULL  );  """  cursor.execute(create_table_sql)  conn.commit()  cursor.close()  conn.close()  # 初始化数据库  
init_db('student_management.db')
7.2.2 插入学生信息
def insert_student(db_path, name, age):  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  cursor.execute(insert_sql, (name, age))  conn.commit()  cursor.close()  conn.close()  # 插入学生信息  
insert_student('student_management.db', 'David', 21)
7.2.3 查询学生信息
def query_student(db_path, id=None):  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  if id is None:  query_sql = "SELECT * FROM student"  else:  query_sql = "SELECT * FROM student WHERE id = ?"  cursor.execute(query_sql, (id,))  results = cursor.fetchall()  cursor.close()  conn.close()  return results  # 查询所有学生信息  
print(query_student('student_management.db'))  # 查询指定ID的学生信息  
print(query_student('student_management.db', 1))
7.2.4 更新学生信息
def update_student(db_path, id, name=None, age=None):  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  update_sql = "UPDATE student SET "  update_fields = []  params = []  if name is not None:  update_fields.append("name = ?")  params.append(name)  if age is not None:  if update_fields:  update_fields.append("AND age = ?")  else:  update_fields.append("age = ?")  params.append(age)  if not update_fields:  print("No fields to update.")  cursor.close()  conn.close()  return  update_sql += ', '.join(update_fields[:-1])  # Remove the last 'AND'  update_sql = update_sql.rstrip(' AND') + " WHERE id = ?"  params.append(id)  cursor.execute(update_sql, tuple(params))  conn.commit()  cursor.close()  conn.close()  # 更新学生信息  
update_student('student_management.db', 1, name='David Jr.', age=22)
7.2.5 删除学生信息
def delete_student(db_path, id):  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  delete_sql = "DELETE FROM student WHERE id = ?"  cursor.execute(delete_sql, (id,))  conn.commit()  cursor.close()  conn.close()  # 删除学生信息  
delete_student('student_management.db', 2)

八、总结

通过本文,我们详细介绍了如何使用 Python 的 sqlite3 模块进行 SQLite3 数据库的基本操作,包括连接数据库、创建表、插入数据、查询数据、更新数据和删除数据等。同时,我们还通过学生信息管理系统的案例,展示了如何将这些基本操作组合起来,实现一个简单的数据库管理系统。

在实际开发中,SQLite3 由于其轻量级和易于使用的特点,非常适合用于原型开发、小型项目或嵌入式系统。然而,对于需要处理大量数据或高并发访问的应用,可能需要考虑使用更强大的数据库系统,如 MySQL、PostgreSQL 或 MongoDB 等。

希望本文能够帮助你快速入门 SQLite3 和 Python 的 sqlite3 模块,并在你的项目中灵活运用。如果你有任何问题或建议,欢迎随时与我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/433725.html

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

相关文章

探探Java与python中的闭包

说在前面:在计算机科学中,闭包是指一个函数以及其引用的周围环境(变量)所组成的整体。简单来说,闭包允许一个函数访问并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。 Java函数式编程—闭包&am…

C++map与set

文章目录 前言一、map和set基础知识二、set与map使用示例1.set去重操作2.map字典统计 总结 前言 本章主要介绍map和set的基本知识与用法。 一、map和set基础知识 map与set属于STL的一部分,他们底层都是是同红黑树来实现的。 ①set常见用途是去重 ,set不…

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式:包装类转换为基本数据类型可以通过以下几种方式:初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言,具有跨平台…

“数字武当”项目荣获2024年“数据要素×”大赛湖北分赛文化旅游赛道一等奖

9月26日,由国家数据局、湖北省人民政府指导的首届湖北省数据要素创新大会暨2024年“数据要素”大赛湖北分赛颁奖仪式在湖北武汉举行。由大势智慧联合武当山文化旅游发展集团有限公司参报的武当山“数字武当”项目,荣获文化旅游赛道一等奖。 据悉&#x…

在系统开发中提升 Excel 数据导出一致性与可维护性的统一规范与最佳实践

背景: 在系统开发过程中,数据导出为 Excel 格式是一个常见的需求。然而,由于各个开发人员的编码习惯和实现方式不同,导致导出代码风格不一。有的人使用第三方库,有的人则自定义实现。这种多样化不仅影响了代码的一致性…

【笔记】X射线物理基础

一、X射线衍射分析简史 1895年X射线发现 1896 年 2 月对骨折的观察:G.和 E. Frost是第一个使用 X 射线进行医疗用途 1897 年法国海关官员的行李扫描。 X射线衍射理论1 X射线衍射理论2 元素的特征X射线 X射线光电子的应用 电磁波的粒子属性 X射线层析成像法 X-ray…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件(Component)角色2.2 具体构件(Concrete Component)角色2.3 装饰(Decorator)角色2.4 具体装饰(Concrete Decorator)角色2.5 测试 结…

蓝桥杯--STM32G431RBT6(TIM定时器的输出频率和占空比,含详细原理介绍和使用方法)

目录 一、前言 二、代码 实现功能:​编辑 按如图配置 定义变量 编写执行代码 显示在LCD上 加入按键效果 三、效果展示 四、代码开源 一、前言 ARR 即自动重装载值(Auto Reload Register)。相当于一个水杯,水杯容量&am…

SpringCloud-Netflix第一代微服务快速入门

1.springCloud常用组件 Netflix Eureka 当我们的微服务过多的时候,管理服务的通信地址是一个非常麻烦的事情,Eureka就是用来管理微服务的通信地址清单的,有了Eureka之后我们通过服务的名字就能实现服务的调用。 Netflix Ribbon\Feign : 客…

性能测试常见故障和解决思路详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、性能问题分析流程 1、查看服务器的CPU、内存 、负载等情况,包括应用服务器和数据库服务器 2、查看数据库健康状态,数据库死锁、连…

【Java】单元测试【主线学习笔记】

文章目录 前言测试分类JUnit单元测试介绍编写单元测试方法的条件IDEA中简易使用JUnit 前言 Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架…

我们是向量数据库的领军企业,我们只招TOP人才

我们是全球领先的向量数据库企业,业务正在快速发展,现开放大量岗位: 前端、产品经理、数据库开发工程师、C、数据库运维、数据库测试…… 我们招聘的唯一目标,寻找 TOP人才! 如果你已经有丰富的经验,那么加…

【友元补充】【动态链接补充】

友元 友元的目的是让一个函数或者类,访问另一个类中的私有成员。 有缘的关键字friend是一个修饰符。 友元分为友元类和友元函数 1.全局函数作友元 2.类作友元 3.类的一个成员函数作友元 好处:可以通过友元在类外访问类内的私有和受保护类型的成员 坏处…

CC面试准备

半导体基础 半导体是介于导体和绝缘体之间的一种介质,在不同条件下表现出不同的导电性或者不导电特性, 电子半导体器件材料大部分为硅,锗等元素 本征半导体:完全不含杂质的纯净半导体,因为不含杂质,其中…

使用API有效率地管理Dynadot域名,设置域名服务器(NS)

前言 Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮箱&…

OCR识别系统 YOLOv8 +Paddle 方案落地

YOLOv8 PaddleOCR 技术方案落地 Yolov8相关文档Step 1 证件模型的训练Step 2 Yolov8进行图片推理Step 3 PaddleOCR进行识别Step 4 整合Yolov8 PaddleOCR 进行OCR Yolov8相关文档 《yolov8 官方网站》 《Yolov8 保姆级别安装》 Ultralytics YOLOv8 是一款尖端的、最先进的 (S…

【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制

以下毕业设计是与深度学习自然语言处理(NLP)相关的毕业设计项目案例,涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域: 实现案例截图: 基于深度学习的文本分类系统基于BERT的情感分析系…

《AI大模型工程师》报考都学习哪些内容呢?

近年来,随着深度学习技术的迅猛发展,AI大模型已经成为人工智能领域的重要研究方向和热点话题。AI大模型,指的是拥有巨大参数规模和强大学习能力的神经网络模型,如BERT、GPT等,这些模型在自然语言处理、计算机视觉等领域…

Vue项目快速整合WangEditor富文本编辑器

Vue项目快速整合WangEditor富文本编辑器 一、安装依赖 npm i wangeditor --save //富文本编辑器 npm install highlight.js -S //代码高亮 npm install dompurify vue-dompurify-html // 防xss 库二、app.vue代码案例 已对接图片、视频接口 ,具体看如下代码…

使用canvas截取web camera指定区域,并生成图片

目标&#xff0c;截取红色色块背后的视频区域。 代码结构如下&#xff1a; <div id"p1"><video id"v1" autoplay playsinline></video><div id"mrz"></div><canvas id"captureCanvas"></can…