PyMysql 02|(包含项目实战)数据库工具类封装

news2025/1/11 13:07:28

目录

七、数据库工具类封装

1、封装的目的

2、设计数据库工具类

3、实现类方法

1️⃣获取、关闭连接

2️⃣查询一条记录

3️⃣增删改数据

4️⃣完整封装代码实现


七、数据库工具类封装

1、封装的目的

将常用的数据库操作,封装到一个方法。 后续再操作数据库时,通过调用该方法来实现。

提高代码的复用性!

2、设计数据库工具类

class DBUtil(object):
    @classmethod        # 标明该方法为类方法,这样可以不用创建实例就可以调用方法
    def __getconn(cls): # __把该方法私有,只有类内部可以使用
        pass

    @classmethod
    def __closeconn(cls):
        pass

    # 常用方法:查询一条
    @classmethod
    def select_one(cls,sql):
        pass

    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        pass

3、实现类方法

1️⃣获取、关闭连接
import pymysql

# 封装数据库工具类
class DBUtil(object):
    # 添加类属性
    conn = None
 
    @classmethod
    def __get_conn(cls):
        # 判断 conn 是否为空, 如果是,再创建
        if cls.conn is None:
            cls.conn = pymysql.connect(host="localhost", port=3306, user="root",
                                       password="123456", database="jingdong", charset="utf8")
 
        # 返回 非空连接
        return cls.conn
 
    @classmethod
    def __close_conn(cls):
        # 判断,conn 不为空,需要关闭。 
        if cls.conn is not None:
            cls.conn.close()
            cls.conn = None # 防止:即使数据库连接已经关闭,cls.conn 依然会保持指向一个已关闭的连接对象。
2️⃣查询一条记录
# 封装数据库工具类
class DBUtil(object):
    # 常用方法:查询一条
    @classmethod
    def select_one(cls, sql):
        cursor = None
        res = None
        try:
            # 获取连接
            cls.conn = cls.__get_conn()
 
            # 获取游标
            cursor = cls.conn.cursor()
 
            # 执行查询语句
            cursor.execute(sql)
 
            # 提取一条结果
            res = cursor.fetchone()
 
        except Exception as err:
            print("查询sql错误:", str(err))
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.__closeconn()
            # 将sql查询结果返回
            return res


if __name__ == '__main__':
    res = DBUtil.select_one("select * from goods")
    print("查询一条数据的结果:",res)


3️⃣增删改数据
class DBUtil(object):
    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 获取连接和游标
            cls.conn = cls.__getconn()
            cursor = cls.conn.cursor()

            # 执行uid语句
            cursor.execute(sql)
            print("影响的行数:", cls.conn.affected_rows())
            
            # 提交事务
            cls.conn.commit()

        except Exception as err:
            # 回滚事务
            cls.conn.rollback()
            print("UID操作失败:", str(err))
        finally:
            # 关闭游标和连接
            cursor.close()
            cls.conn.close()



if __name__ == '__main__':
    DBUtil.uid_db("insert into goods values (0,'数据库工具类封装测试英寸笔记本',1,1,'2999',default,default);")
4️⃣完整封装代码实现

 py数据库工具类封装Test07.py

import pymysql
class DBUtil(object):
    conn =None

    @classmethod        # 标明该方法为类方法,这样可以不用创建实例就可以调用方法
    def __getconn(cls): # __把该方法私有,只有类内部可以使用
        if cls.conn is None:
            cls.conn = pymysql.connect(host="localhost", port=3306, user="root",
                           password="123456", database="jingdong", charset="utf8")
        return cls.conn

    # 常用方法:查询一条
    @classmethod
    def __closeconn(cls):
        if cls.conn is not None:
            cls.conn.close()
            cls.conn = None

    @classmethod
    def select_one(cls,sql):
        cursor = None
        res = None
        try:
            cls.conn = cls.__getconn()
            cursor = cls.conn.cursor()

            cursor.execute(sql)
            res = cursor.fetchone()

        except Exception as err:
            print("查询操作失败:",str(err))


        finally:
            cursor.close()
            cls.__closeconn()
            return res


    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            cls.conn = cls.__getconn()
            cursor = cls.conn.cursor()

            cursor.execute(sql)
            print("影响的行数:", cls.conn.affected_rows())

            cls.conn.commit()
        except Exception as err:
            cls.conn.rollback()
            print("UID操作失败:", str(err))
        finally:
            cursor.close()
            cls.conn.close()





if __name__ == '__main__':
    # res = DBUtil.select_one("select * from goods")
    # print("查询一条数据的结果:",res)
    DBUtil.uid_db("insert into goods values (0,'数据库工具类封装测试英寸笔记本',1,1,'2999',default,default);")

 py使用数据库工具类.py

from py数据库工具类封装Test07 import DBUtil

res = DBUtil.select_one("select * from goods")
DBUtil.uid_db("delete from goods where id=24;")
print(res)


 

全部内容:

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获-CSDN博客

PyMysql 01|(包含超详细项目实战)数据库工具类封装-CSDN博客 

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

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

相关文章

案例研究:UML用例图中的结账系统

在软件工程和系统分析中,统一建模语言(UML)用例图是一种强有力的工具,用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究,详细解释UML用例图的关键概念,并说明其在设计结账系统中的应用。 用…

【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题

本篇鸡汤:没有人能替你承受痛苦,也没有人能拿走你的坚强. 欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:带你解答洛谷的括号序列问题(绝对巧解) 制作日期:2025.01.10 隶属专栏:C/C题…

点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)

文章目录 1. tabBar 的跳转方式2. tabBar 跳转的特点3. 你的配置分析4. 生命周期触发情况5. 总结 很多人不明白什么是第一次加载,两种情况讨论,第一种情况假设我是开发者,第一次加载就是指点击微信开发者工具上边的编译按钮,每点击…

CUDA、CUDNN以及tensorRT的版本对应关系

各版本的对应除了可以看文件的命名上还可以查看TensorRT的Release日志: Release Notes :: NVIDIA Deep Learning TensorRT Documentation 这个是官方测试TensorRT的Release日志,里面指明了当前测试的TensorRT版本是在哪个CUDNN等库下的测试结果&#x…

设计模式(观察者模式)

设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…

Helm部署activemq

1.helm create activemq 创建helm文件目录 2.修改values.yaml 修改image和port 3. helm template activemq 渲染并输出 4. helm install activemq activemq/ -n chemical-park // 安装 5.启动成功

Untiy中如何嵌入前端页面,从而播放推流视频?

最近工作中频繁用到unity,虽然楼主之前也搞过一些UNTY游戏开发项目,但对于视频这块还是不太了解,所以我们采用的方案是在Unity里寻找一个插件来播放推流视频。经过我的一番寻找,发现了这款Vuplex 3D WebView,它可以完美的打通Unit…

rabbitmq的三个交换机及简单使用

提前说一下,创建队列,交换机,绑定交换机和队列都是在生产者。消费者只负责监听就行了,不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列,交换机,绑定交换机…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数,以及如何排除节假日计算两个日期之间的工作日数。 1,如何计算到两个日期之间的工作日数? 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六,星期日 2,如…

初学stm32 --- DAC模数转换器工作原理

目录 什么是DAC? DAC的特性参数 STM32各系列DAC的主要特性 DAC框图简介(F1/F4/F7) 参考电压/模拟部分电压 触发源 关闭触发时(TEN0)的转换时序图 DMA请求 DAC输出电压 什么是DAC? DAC,全称:Digital…

从预训练的BERT中提取Embedding

文章目录 背景前置准备思路利用Transformer 库实现 背景 假设要执行一项情感分析任务,样本数据如下 可以看到几个句子及其对应的标签,其中1表示正面情绪,0表示负面情绪。我们可以利用给定的数据集训练一个分类器,对句子所表达的…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手? 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);…

iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)

引言 在移动应用中,图片上传是一个常见的功能,尤其是在个人中心或社交平台场景中,用户经常需要上传图片到服务器,用以展示个人风采或记录美好瞬间。然而,实现多图片上传的过程中,如何设计高效的上传逻辑并…

基于phpstudy快速搭建本地php环境(Windows)

好好生活,别睡太晚,别爱太满,别想太多。 2025.1.07 声明 仅作为个人学习使用,仅供参考 对于CTF-Web手而言,本地PHP环境必不可少,但对于新手来说从下载PHP安装包到配置PHP环境是个非常繁琐的事情&#xff0…

ffmpeg 编译遇到的坑

makeinfo: error parsing ./doc/t2h.pm: Undefined subroutine &Texinfo::Config::set_from_init_file called at ./doc/t2h.pm line 24. 编译选项添加: --disable-htmlpages

Git:merge合并、冲突解决、强行回退的终极解决方案

首先还是得避免冲突的发生,无法避免时再去解决冲突,避免冲突方法: 时常做pull、fatch操作,不要让自己本地仓库落后太多版本;在分支操作,如切换分支、合并分支、拉取分支前,及时清理Change&#…

国内外网络安全政策动态(2024年12月)

▶︎ 1.2项网络安全国家标准获批发布 2024年12月6日,根据2024年11月28日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告(2024年第29号),全国网络安全标准化技术委员会归口的2项网络安全国家标准正…

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs:开源大模型嵌入模型:开源嵌入模型模型的访问和部署:Ollama数据存储和检索:PostgreSQL, pgvector 和 pgai后端:FastAPI前端:NextJS缺失的一环:评估和…

通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性

目录 1 引言2 手工构建3 基于Maven的构建4 总结 1 引言 最近在阅读一本Java Web的书籍1时,手工实现书上的一个含多个Packages的例子,手工进行编译、运行,最终实现了效果。但感觉到整个构建过程非常繁琐,不仅要手写各个源文件的编…