python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

一.简介

在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy;

PyMySQL — MySQL 数据库驱动,用于与 MySQL 数据库建立连接并执行 SQL 操作

SQLAlchemy — ORM 框架,提供了通过 Python 类与数据库表进行交互的能力。它依赖于数据库驱动(如 PyMySQL)来执行底层的 SQL 操作。

其实PyMySQL 在常规开发中已经具备了与MySQL数据库交互的能力,SQLAlchemy 是通过PyMySQL来实现与数据库的交互,所以我们不要着急,好菜要慢慢上,我们先介绍PyMySQL ,好,来开始我们今天的日拱一卒!

二.安装pymysql

#使用豆瓣源安装 提升安装速度
pip install pymysql -i http://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com

三.创建一个数据库

我们先用Navicat创建一个数据库,用来作为测试!

注意:

字符集:utf8mb4

排序规则:utf8mb4_0900_ai_ci

在这里插入图片描述

四.创建python配置文件及配置文件调用包

创建配置文件db_config.ini

在当前项目中创建config文件夹,在文件夹下db_config.ini文件,作为我们的数据库配置文件,内容如下:

[localdb]
host     = localhost
user     = root
password = yourpsw
port     = 3306
database = myurlhub

创建配置文件调用帮助包

在当前项目中创建utils文件夹,新建__init__.py文件,里面不用写任何东西,在utils文件夹下新建config_helper.py文件,用来帮助我们获取配置文件信息,文件内容如下:

import configparserclass Config(object):def __init__(self, filename, encoding='UTF-8'):# 声明配置类对象self.config = configparser.ConfigParser()# 读取配置文件self.config.read(filename, encoding)def get_value(self, section, option):"""获取 value"""value = self.config.get(section, option)return valuedef get_items(self, section):value = dict(self.config.items(section))return value# 读取配置文件
# config.read(fileName, 'GBK')
# print(f"sections: {config.sections()}")
# print(f"options: {config.options('localdb')}")
# print(f"items: {config.items('localdb')}")

我们的整体结构文件:

在这里插入图片描述

五.创建我们的pymysql_helper.py 帮助程序包简化我们的调用操作

其实这时候已经可以使用pymysql来操作数据库了,但是别急因为好的程序员会创建一个帮助类库来帮助我们简化代码,和健全代码

在我们的utils文件夹下,新建pymysql_helper.py文件

#pymysql_helper.py文件
import pymysql
from utils import config_helper
import osclass PyManage:def __init__(self):# 加载数据库配置config_file_path = os.path.join(os.getcwd(),'config\db_config.ini') config = config_helper.Config(config_file_path,'UTF-8')self.__localdb = config.get_items('localdb')# 建立数据库连接self.db = pymysql.connect(host=self.__localdb['host'],user=self.__localdb['user'],password=self.__localdb['password'],port=int(self.__localdb['port']),  # 确保端口是整数类型database=self.__localdb['database'])def execute(self, sql, params=None, commit=False):"""执行 SQL 查询或更新语句。根据 SQL 类型执行查询或更新。参数:sql (str): SQL 查询或更新语句。params (tuple 或 dict): 可选的查询或更新参数。commit (bool): 如果是修改数据的操作(INSERT/UPDATE/DELETE),则传入 True 来提交事务。返回:results: 查询结果(对于 SELECT),如果是修改操作返回影响的行数。"""results = Nonetry:with self.db.cursor() as cursor:# 执行 SQL 语句,使用参数化查询防止 SQL 注入if params:cursor.execute(sql, params)else:cursor.execute(sql)# 如果是查询操作(SELECT),返回结果if sql.strip().lower().startswith('select'):results = cursor.fetchall()# 如果是修改操作(INSERT/UPDATE/DELETE),提交事务if commit:self.db.commit()results = Trueexcept pymysql.MySQLError as e:print(f"数据库操作出错: {e}")if commit:# 如果是修改操作出错,回滚事务self.db.rollback()results = Falseelse:results = Noneexcept Exception as e:print(f"发生未知错误: {e}")if commit:# 如果是修改操作出错,回滚事务self.db.rollback()results = Falseelse:results = Nonereturn resultsdef close(self):"""显式关闭数据库连接。"""try:if self.db.open:self.db.close()print("数据库连接已关闭!")except Exception as e:print(f"关闭数据库连接时出错: {e}")def __del__(self):"""析构函数,确保在对象销毁时关闭连接。"""self.close()

整体项目的结构:

在这里插入图片描述

代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!

七.使用pymysql库来帮我们创建一张表

  1. 在主程序main.py实现以下代码

    from utils import pymysql_helperdb_manager = pymysql_helper.PyManage()create_table_sql = '''CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT NOT NULL,email VARCHAR(255) UNIQUE NOT NULL);'''
    result = db_manager.execute(create_table_sql,commit=True)
    if result:print('执行成功!')
    else:print('执行失败!')
    db_manager.close()'''
    输出结果:
    执行成功!
    数据库连接已关闭!
    '''
    

    来看看执行后我们的数据库:

    在这里插入图片描述

八.使用pymysql库来给表里面新增数据

  1. 在主程序main.py实现以下代码

    sql_insert = "INSERT INTO users (name, age,email) VALUES (%s, %s,%s)"
    params_insert = ('SEEONTIME', 30,'SEEONTIME@qq.com')
    result = db_manager.execute(sql_insert, params_insert, commit=True)
    if result:print('执行成功!')
    else:print('执行失败!')
    db_manager.close()'''
    执行成功!
    数据库连接已关闭!
    '''
    

    来看看执行后我们的数据库:

    在这里插入图片描述

九.使用pymysql库来查询数据

  1. 在主程序main.py实现以下代码

    # 查询数据
    sql_select = "select * from users"results = db_manager.execute(sql_select,commit=False)
    if results:print('执行成功!')print(results)
    else:print('执行失败!')
    db_manager.close()'''
    输出结果:
    执行成功!
    ((1, 'SEEONTIME', 30, 'SEEONTIME@qq.com'),)
    数据库连接已关闭!
    '''
    

十.使用pymysql库来修改数据

  1. 在主程序main.py实现以下代码

    # 修改数据
    sql_update = "UPDATE users SET age = %s WHERE name = %s"params = ( 35,'SEEONTIME')
    results = db_manager.execute(sql_update,params,commit=True)
    if results:print('执行成功!数据已修改。')sql_select = "select * from users"new_results = db_manager.execute(sql_select,commit=False)print(new_results)
    else:print('执行失败!')
    db_manager.close()
    '''
    输出结果:
    执行成功!数据已修改。
    ((1, 'SEEONTIME', 35, 'SEEONTIME@qq.com'),)
    数据库连接已关闭!
    '''
    

十一.使用pymysql库来删除数据

  1. 在主程序main.py实现以下代码

    # 删除数据
    sql_delete = "DELETE FROM users WHERE name = %s"
    params = ('SEEONTIME',)
    results = db_manager.execute(sql_delete,params,commit=True)
    if results:print('执行成功!数据已删除。')sql_select = "select * from users"new_results = db_manager.execute(sql_select,commit=False)print(new_results)
    else:print('执行失败!')
    db_manager.close()
    '''
    输出结果:
    执行成功!数据已删除。
    ()
    数据库连接已关闭!
    '''
    

十二.总结

写到这里我们还没有实现ORM,但是已经能够利用pymysql库来帮助我们操作数据库!可能大家看到这里发现这不还是sql语言么?sql换成存储过程不又是老一套,而是使用还是不方便,查询的数据还需要我们自己来处理!

对,这个方式确实不咋地,因为好菜还在后面。。。。

代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!

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

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

相关文章

ADSP21489 M25P16启动后无法使用USBi的问题

项目背景是ADSP21489 使用SPI MASTER 启动模式,程序存储在M25P16中 编译cces产生运行代码 第二步,插上USBi仿真器下载sigma topo 发现无法正常下载 操作多次发现需要目标板重新上点后需要拔插usbi才能下载和启动dsp程序 原因分析: 就是第一次插上usbi后,在给目标板上电,可…

量子计算包kaiwu安装过程踩过的坑

目录 1 安装过程 2 官方代码测试 3 踩坑说明 首先,目前的kaiwu版本仅支持python3.8,所以必须要下载python3.8才能运行kaiwu 1 安装过程 step1: 在页面的SDK标签下,找到对应操作系统的kaiwu包。 step2: 下载python3.8到本地,可…

线程相关概念

线程概念 线程是操作系统中一种基本的执行单元,是程序的最小调度单位。一个程序可以包含多个线程,每个线程代表一个独立的执行路径,使得程序可以并发地处理多个任务。 线程的基本概念 线程与进程的区别: 进程是资源分配的单位&…

SSH实验5密钥登录Linuxroot用户(免密登录)

当用户尝试通过SSH连接到远程服务器时,客户端会生成一对密钥:公钥和私钥。公钥被发送到远程服务器,并存储在服务器的~/.ssh/authorized_keys文件中。而私钥则由客户端保管,不会传输给服务器。 在连接过程中,客户端使用…

域名邮箱推荐:安全与稳定的邮件域名邮箱!

域名邮箱推荐及绑定攻略?最好用的域名邮箱服务推荐? 域名邮箱,作为一种个性化且专业的电子邮件服务,越来越受到企业和个人的青睐。烽火将详细介绍域名邮箱登录的全过程,从注册到登录,帮助您轻松掌握这一重…

政治经济学笔记

【拯救者】政治经济学速成(基础习题) 研究生产关系必须联系生产力和上层建筑 1.生产力与生产关系 生产力代表生产的物质内容,生产关系是生产的社会形式。生产力决定生产关系,生产关系对生产力具有 反作用 *其中的”反作用”指的是…

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭?基于半关闭…

python | 包

1. 在python中什么是包? ​ 包是一种组织代码的方式,如下图所示红色部分目录mypackage就称为一个包,它之所以称为一个包完全是因为它里面有蓝色方框里的文件__init__.py。 ​ 这个目录被定义为一个包之后,我们就可以通过import来…

Qt信号和槽-->day04

Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目: 题解: const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

腾讯首个3D生成大模型Hunyuan3D-1.0分享

Hunyuan3D-1.0是腾讯混元团队开发的首个同时支持文字、图像转3D的大模型,可以基于文本描述或单张图像生成3D模型。 Hunyuan3D-1.0采用了多视图生成和多视图重建两阶段的方法,能够从不同视角捕捉对象的纹理和几何信息。 在多视图生成阶段,Hu…

【JavaEE初阶 — 多线程】内存可见性问题 volatile

1. 内存可见性问题 内存可见性的概念 什么是内存可见性问题呢? 当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。在Java中,可以借助 synchronized、volatile 以及各种Lock 实现可见性。如果我们将变量声…

排序算法.

排序算法是最常用的一种算法.它解决的主要问题是在一定的时间复杂度和空间复杂度的条件下,对n个数按照一定的顺序进行排序.排序算法主要分为四大类,即插入类,交换类,选择类和归并类,不同的排序算法的时间复杂程度和空间复杂程度差别很大. 排序算法主要有以下几种: 1.插入类排…

iOS18.1通話錄音實測 錄音夠清晰 文字轉錄廣東話用唔到?

iOS 18.1功能實測|期待已久的通話錄音功能終在iOS18.1推出,讓用家可以在通話過程中輕鬆錄音,並附上逐字稿功能,為使用者提供更靈活的通話記錄方式。記者實測通話錄音功能,看看錄音清晰度、方便性、逐字轉錄的表現。 打…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障,说是测试环境的附件上传功能报了 403 的错误,错误信息:403 Request Entity Too Lager。我尝试复现问题,发现传个几兆的文件都费劲啊,一传一个失败。不用说,项目用到 ng 代理&#x…

【C++】新手入门指南

> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 &#x1…

ElasticSearch备考 -- Cross cluster replication(CCR)

一、题目 操作在cluster1(local)中操作索引task,复制到cluster2(remote)中 二、思考 CCR 我们可以对标MySQL 理解为为主从,后者备份。主节点负责写入数据,从/备节点负责同步时主节点的数据。 …

IDEA在编译时: java: 找不到符号符号: 变量 log

一、问题 IDEA在编译的时候报Error:(30, 17) java: 找不到符号符号: 变量 log Error:(30, 17) java: 找不到符号 符号: 变量 log 位置: 类 com.mokerson.rabbitmq.config.RabbitMqConfig 二、解决方案 背景:下载其他同事代码时,第一次运行&#xff0c…

一文熟悉新版llama.cpp使用并本地部署LLAMA

0. 简介 最近是快到双十一了再给大家上点干货。去年我们写了一个大模型的系列,经过一年,大模型的发展已经日新月异。这一次我们来看一下使用llama.cpp这个项目,其主要解决的是推理过程中的性能问题。主要有两点优化: llama.cpp …

[翻译]ANSI X9.24-3-2017

目录 1 目的 2 范围 2.1 应用 3 参考文献 4 术语和定义 4.1 高级加密标准(AES) 4.2 AES 4.3 算法 4.4 ANSI 4.5 基础推导密钥(BDK) 4.6 BDK 4.7 BDK ID 4.8 加密密钥 4.9 加密密钥同步 4.10 密码强度 4.11 派生 4.12 派生标识符(ID) 4…