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

news/2024/7/3 17:16:03

🍀 前言

博客地址:

  • 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 sqlite3


class SQLite3Tools:
    def __init__(self, db_name: str) -> None:
        self.db_name = db_name
        self.connection = None
        self.cursor = None
        self.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()
        # 返回插入的行的ID
        return self.cursor.lastrowid

    def 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.rowcount

    def 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://lihuaxi.xjx100.cn/news/2218128.html

相关文章

522. 最长特殊序列 II

题目 给定字符串列表 strs &#xff0c;返回其中最长的特殊序列的长度。如果最长特殊序列不存在&#xff0c;返回 -1。 特殊序列定义如下&#xff1a;该序列为某字符串独有的子序列&#xff08;即不能是其他字符串的子序列&#xff09;。 字符串 s 的子序列可以通过删去字符…

使用超声波麦克风阵列预测数控机床刀具磨损

预测性维护是使用传感器数据来推断机器状态&#xff0c;并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势&#xff0c;包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…

文档项目:攻坚克难

鉴于交流离心机存在的缺点&#xff1a;转速相对偏差、稳定精度不够高&#xff1b;带负载能力受外界扰动后&#xff0c;波动较大&#xff1b;寿命短&#xff0c;研究所各相关部门成立组成技术攻关团队&#xff0c;齐心协力&#xff0c;攻坚克难&#xff0c;在摸索中突破创新&…

【热】大数据信用报告查询平台哪个比较好?这个平台值得一试!

在当今数字化时代&#xff0c;大数据技术的发展为个人和企业提供了更便捷、精准的信用报告查询服务。选择一个优秀的大数据信用报告查询平台至关重要&#xff0c;它直接影响到您获取信用信息的准确性和全面性。 首先&#xff0c;选择大数据信用报告查询平台时&#xff0c;您可以…

TDengine防火墙配置

TDengine 部署时建议禁用防火墙&#xff0c;对于有安全要求必须启用防火墙的的场景&#xff0c;可以只开放 TDengine 相关端口。 TDengine 端口列表 TDengine 不同版本使用的端口也不尽相同&#xff0c;以下是不同版本的端口列表。 TDengine 2.x 端口协议描述6030-6035TCP/…

JupyterLab使用指南(三):JupyterLab的Cell详细介绍

JupyterLab Cell 使用教程 JupyterLab 的 cell 是一种强大的工具&#xff0c;提供了编写、执行、展示和记录的全方位支持&#xff0c;使得复杂的计算任务变得简单直观。通过熟练掌握 cell 的各种操作和快捷键&#xff0c;用户可以显著提高工作效率&#xff0c;专注于解决实际问…

web前端defer:深度解析与实用指南

web前端defer&#xff1a;深度解析与实用指南 在web前端开发中&#xff0c;defer是一个关键的属性&#xff0c;它影响着脚本的加载和执行方式。然而&#xff0c;对于许多开发者来说&#xff0c;defer的真正含义和用法却常常带来困惑。本文将通过四个方面、五个方面、六个方面和…

不知道怎么往在VMware WorkStation虚拟机传输文件?玩VMware的你一定要知道

前言 这段时间玩VMware虚拟机的小伙伴可以说是真的挺多的&#xff0c;但这也出现了不少的问题&#xff1a;不知道怎么把文件从主机传输到虚拟机上的系统文件夹。 一般咱们使用的系统都是Windows&#xff0c;所以按照这个逻辑&#xff0c;可以给主机的Windows系统设置一个共享…