Python 数据持久化:使用 SQLite3 进行简单而强大的数据存储

🍀 前言

博客地址:

  • CSDN:https://blog.csdn.net/powerbiubiu

👋 简介

SQLite3是一种轻量级嵌入式数据库引擎,它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中,无需额外安装。你只需导入 sqlite3 模块即可开始使用,不仅可以实现数据的持久化操作,还能对数据进行增删改查的功能。

📖 正文

1 SQLite3的使用

1.1 连接数据库

如果连接的数据库不存在则创建,
以下代码在python文件同级目录下创建一个test.db文件

import sqlite3
# 连接到数据库(如果不存在则创建)
connection = sqlite3.connect('test.db')
1.2 创建表

创建一个users表,其中包含id,name,age

# 创建表
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
# 提交更改
connection.commit()
1.3 插入数据
# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('李四', 18))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('张三', 20))
#
# 提交更改
connection.commit()
print(cursor.rowcount)
print(cursor.lastrowid)# 1
# 2

Tips:
SQLite3在执行多条数据插入,并且commit提交后,rowcount只会返回最后一次插入影响的行,也就是1,而lastrowid只返回插入的最后一条数据的id。

1.4 查询数据

首先在控制台中通过sqlite3 test.db连接数据库,在通过select * from users;可以查询到我们刚才添加的数据
image.png
通过代码查询,我们发现,返回的数据和连接数据库查询的一致
通过代码查询返回的是一个列表

# 查询数据
cursor.execute("SELECT * FROM users")
# 获取所有行
rows = cursor.fetchall()
print(rows)
print(type(rows))# [(1, '李四', 18), (2, '张三', 20)]
# <class 'list'>

如果查询一个数据,返回的结果,仍然是列表保存的元组数据

# 查询数据
cursor.execute("SELECT * FROM users WHERE id = 1")
# 获取所有行
rows = cursor.fetchall()
print(rows)
print(type(rows))# [(1, '李四', 18)]
# <class 'list'>
1.5 更新数据

将id为1的name改成王五

# 更新数据
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ('王五', 1))
connection.commit()
# 打印受影响的行
print(cursor.rowcount)# 1

这时,我们在查询一下结果,发现id为1的数据被修改了

# 查询数据
cursor.execute("SELECT * FROM users")
# # 获取所有行
rows = cursor.fetchall()
print(rows)# [(1, '王五', 18), (2, '张三', 20)]
1.6 删除数据

与更新操作一样,删除成功后会返回受影响的行。
备注:需要注意,第二个参数传入元组时,只有一个元素的情况下,需要加个,号,表示该参数为元组

cursor.execute("DELETE FROM users WHERE id = ?", (1,))
connection.commit()
print(cursor.rowcount)# 1
1.7 关闭连接
# 关闭游标和连接
cursor.close()
connection.close()

2 上下文管理器操作SQLite3

with sqlite3.connect('test.db') as connection:cursor = connection.cursor()# 执行数据库操作cursor.execute("SELECT * FROM users")rows = cursor.fetchall()print(rows)
# [(1, '李四', 18), (2, '张三', 20)]

这种方式方便好用,可以不用手动编写关闭游标和连接的代码,与with open()是使用方式相同。

3 封装工具类

import sqlite3class SQLite3Tools:def __init__(self, db_name: str) -> None:self.db_name = db_nameself.connection = Noneself.cursor = Noneself.connect()def __del__(self):self.disconnect()def connect(self) -> None:"""连接数据库:return:"""# 连接到数据库(如果不存在则创建)self.connection = sqlite3.connect(self.db_name)self.cursor = self.connection.cursor()def disconnect(self):# 关闭游标和连接if self.cursor:self.cursor.close()if self.connection:self.connection.close()def execute_create(self, sql):"""创建数据库:param sql::return:"""self.cursor.execute(sql)def execute_query(self, sql: str, parameters: tuple = None) -> list:"""查询操作:param sql: sql语句:param parameters: 参数:return: 返回结果"""# 执行查询if parameters:self.cursor.execute(sql, parameters)else:self.cursor.execute(sql)return self.cursor.fetchall()def execute_insert(self, sql: str, parameters: tuple = None) -> int:"""插入操作:param sql: sql语句:param parameters: 参数:return: 返回结果"""if parameters:self.cursor.execute(sql, parameters)else:self.cursor.execute(sql)self.connection.commit()# 返回插入的行的IDreturn self.cursor.lastrowiddef execute_update(self, sql: str, parameters: tuple = None) -> int:"""更新操作:param sql: sql语句:param parameters: 参数:return: 返回结果"""if parameters:self.cursor.execute(sql, parameters)else:self.cursor.execute(sql)self.connection.commit()# 返回受影响的行return self.cursor.rowcountdef execute_delete(self, sql: str, parameters: tuple = None) -> int:"""删除操作:param sql: sql语句:param parameters: 参数:return: 返回结果"""if parameters:self.cursor.execute(sql, parameters)else:self.cursor.execute(sql)self.connection.commit()# 返回受影响的行return self.cursor.rowcount
3.1 创建数据库和表
# 创建工具类实例
db = SQLite3Tools('test.db')
# 第一次使用需要创建一个表
db.execute_create('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
3.2 插入数据
db = SQLite3Tools('test.db')
# 执行插入
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('张三', 18))
print(f"张三的id为: {user_id}")
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('李四', 19))
print(f"李四的id为: {user_id}")
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('王五', 19))
print(f"王五的id为: {user_id}")# 张三的id为: 1
# 李四的id为: 2
# 王五的id为: 3
3.3 查询数据
db = SQLite3Tools('test.db')
# 执行查询
result = db.execute_query("SELECT * FROM users")
print(result)# [(1, '张三', 18), (2, '李四', 19), (3, '王五', 19)]
3.4 更新数据

将张三的年龄更新为30岁

db = SQLite3Tools('test.db')
# 执行更新
result = db.execute_update("UPDATE users SET age = ? WHERE name = ?", (30, '张三'))
print(f"受影响的行:{result}")# 受影响的行:1
3.5 删除数据

删除id为4的数据(不存在的一个数据)

db = SQLite3Tools('test.db')
# 删除一个不存在的数据
result = db.execute_delete("DELETE FROM users WHERE id = ?", (4,))
print(f"受影响的行:{result}")# 受影响的行:0

删除id为3的数据(该数据存在)

db = SQLite3Tools('test.db')
# 删除一个存在的数据
result = db.execute_delete("DELETE FROM users WHERE id = ?", (3,))
print(f"受影响的行:{result}")# 受影响的行:1

✏ 总结

SQLite是一种轻量级的、零配置的、自包含的、开源的关系型数据库引擎。它提供了一个简单而方便的方式来存储和管理数据。
使用场景:

  • 桌面应用程序:sqlite3可以作为桌面应用程序的本地数据库,用于存储用户设置、缓存数据等;
  • 移动应用程序:sqlite3在Android和iOS平台上都有广泛的使用,可以作为移动应用程序的本地数据库,存储离线数据、用户信息等;
  • 小型项目:对于一些简单的项目,可以使用sqlite3作为数据库解决方案,避免了复杂的数据库配置和维护工作;
  • 学习和测试:sqlite3是一个很好的学习关系型数据库的工具,可以帮助初学者快速了解数据库的基本概念和操作。

💖 欢迎关注我的公众号

在这里插入图片描述

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

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

相关文章

IRIS论文阅读笔记

这是ICLR2023一篇world model的论文&#xff0c;提出了一个称为IRIS的world model方法模型仍然是分为两部分&#xff0c;一部分是模拟世界的world model&#xff0c;包括预测下一帧的观测&#xff0c;预测当前reward&#xff0c;预测是否terminate的三个输出&#xff1b;第二部…

Linux ubuntu安装pl2303USB转串口驱动

文章目录 1.绿联PL2303串口驱动下载2.驱动安装3.验证方法 1.绿联PL2303串口驱动下载 下载地址&#xff1a;https://www.lulian.cn/download/16-cn.html 也可以直接通过CSDN下载&#xff1a;https://download.csdn.net/download/Axugo/89447539 2.驱动安装 下载后解压找到Lin…

【Linux命令行】从时间管理->文件查找压缩的指令详解

目录 1.date 命令&#xff08;显示时间&#xff09; 1.1 显示方面 1.2 设定时间 1.3 时间戳转换 1.4 cal&#xff08;日历&#xff09; 2. 重定向 2.1 输出重定向&#xff08;echo >&#xff09;cin 2.2 追加重定向 >> 2.3 输入重定向 < cout 3.find 指…

API接口设计的艺术:如何提升用户体验和系统性能

在数字时代&#xff0c;API接口的设计对于用户体验和系统性能有着至关重要的影响。良好的设计可以显著提升应用程序的响应速度、可靠性和易用性。以下是几个关键点&#xff0c;帮助改善API接口的设计&#xff1a; 1. 理解并定义清晰的要求 用户研究&#xff1a;与最终用户进行…

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集&#xff0c;快速获取物体精确的3D数据&#xff0c;实现1:1复刻原物体&#xff0c;扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备&#xff0c;拥有多项国家专利&…

【大分享04】OFD版式赋能政务服务电子文件归档和电子档案管理

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自北京数科网维技术有限责任公司&#xff0c;作者&#xff1a;张严。 PART1 政务服务电子文件归档和电子档案管理背景 政务服务是政务服务机构…

RockChip Android12 Settings一级菜单

一:概述 在之前的文章中对Android8.1 Settings的流程进行了说明,本章将针对Android12 Settings一级菜单的加载逻辑进行详细说明,Settings版本之间的差异不是很大,有兴趣的同学可自行学习,本文不在做赘述。 Android8.1 Settings说明:RockChip Android8.1 Settings-CSDN博…

早期发现,健康生活!第三届ZAODX世界肿瘤早筛大会圆满落幕!

2024年6月15日-16日&#xff0c;第三届ZAODX世界肿瘤早筛大会在雄安新区盛大开幕&#xff01;本次会议由河北雄安新区管理委员会公共服务局指导&#xff0c;第三届ZAODX世界肿瘤早筛大会组委会和早筛网主办&#xff0c;粤港澳大湾区精准医学研究院&#xff08;广州&#xff09;…

python GUI开发: tkinter事件处理的几种方式详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

GEM5 Garnet +DSENT: NoC power model 功耗模型

0. 简介 现在&#xff08;2024&#xff09;集成的是dsent。 Garnet作者&#xff0c;Turshar在2018年说Orion已经过时不在集成DSENT&#xff0c;但是集成DSENT的代码随着gem5更新也过时了&#xff0c;而他短期内没有更新的计划&#xff08;2018年说的&#xff09;。2023年还有一…

SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案

JetCache 是一个基于 Java 的分布式缓存解决方案&#xff0c;旨在提供高性能和可扩展性。它支持多种后端存储&#xff0c;如 Redis、Hazelcast、Tair 等&#xff0c;可以作为应用程序的缓存层&#xff0c;有效地提升数据访问性能和响应速度。 JetCache 的主要特点包括&#x…

springboot应用启动太慢排查 半天才打印日志

springboot应用启动太慢排查 半天才打印日志 解决办法 hostnamectl 命令查看主机名 vim /etc/hosts 加上主机名配置 127.0.0.1 hostname

Java_JDK下载与环境变量配置

目录 一、JDK下载安装 二、安装后配置环境变量 三、在编辑器里使用JDK 一、JDK下载安装 JDK 是Java开发工具包&#xff0c;它提供了用于开发和运行Java程序所需的工具和库。JDK包括Java编译器、Java虚拟机、Java标准库等。在IDEA中使用Java语言编写代码时&#xff0c;需要安…

为什么 Kubernetes 调试如此成问题?

在 Kubernetes 集群中调试应用程序问题通常感觉就像在迷宫中穿行。容器在设计上是短暂的&#xff0c;一旦部署就不可改变。当出现问题并且我们需要深入研究问题时&#xff0c;这会带来独特的挑战。在深入研究调试工具和技术之前&#xff0c;必须掌握核心问题&#xff1a;为什么…

openlayers 使用WMTS和XYZ加载天地图切片服务

openlayers 使用WMTS和XYZ加载天地图切片服务 本篇介绍一下使用openlayers加载天地图切片&#xff0c;两种方法&#xff1a; 使用WMTS使用XYZ 1 需求 openlayers加载天地图 2 分析 主要是不同类型source的使用 WMTS&#xff08;Web Map Tile Service&#xff09; 是 OGC…

一道全等三角形证明题

接着上次那道题 一道初中一年级几何题解析&#xff0c;再来做一道初中一年级下半学期几何题目&#xff1a; 傍晚丢垃圾散步时看到小小的学生学习群里丢了这个题目&#xff0c;想到一个解法。实在构造不出契合题干阅读材料结论的三角形&#xff0c;索性先根据这结论做一个推论…

ByteTrack

1. 论文中伪代码表示的流程图 2. 简要版 此图源自&#xff1a; ByteTrack多目标跟踪原理&#xff0c;白老师人工智能学堂 3. 详细版 根据ByteTrack-CPP-ncnn代码的数据流画的较为详细的流程图&#xff1a; 4. ByteTrack-CPP-ncnn的UML类图 Reference ByteTrack多目标跟踪原…

Excel小技巧| 批量多列多行转为一列

前期刘小生Star分享了Excel批量一列转多列多行&#xff0c;你学会了嘛&#xff01; 前期刘小生遇到需“对多列对行数据合并并找到唯一不重复的信息”&#xff0c;今天举一反三&#xff0c;继续沿用“替换等号”方法&#xff0c;将多列多行转为一列&#xff01; 下面一个模拟案…

xml与动态SQL

XML映射文件 规范 XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。 ● XML映射文件的namespace属性为Mapper接口全限定名一致。 ● XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。 动态SQL &…

Excel批量一列转多列多行

你在公司或学校是否遇到过对人员进行分组&#xff0c;你是否曾一个一个复制粘贴&#xff0c;如只有100人&#xff0c;尚有时间一一分组&#xff0c;如1000人&#xff0c;甚至更多&#xff0c;不知分到“地老天荒”是否可以完成&#xff01; 今天刘小生分享一个方法“用替换等号…