Python脚本之连接MySQL【四】

本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/124640412

之前写了篇 Python脚本之连接MySQL【三】,日常使用过程中,代码实际有很多改动,特此更新;

【实际这篇博客推迟发布N个月】

个人博客:https://blog.csdn.net/zyooooxie

【以下所有内容仅为个人项目经历,如有不同,纯属正常】

Cursor类的nextset()、_nextset()

https://peps.python.org/pep-0249/#nextset

Cursor.nextset()This method will make the cursor skip to the next available set, discarding any remaining rows from the current set.If there are no more sets, the method returns None. Otherwise, it returns a true value and subsequent calls to the .fetch*() methods will return rows from the next result set.

在这里插入图片描述

方法优化【2】

【读取ini配置文件 + 建立、关闭数据库连接】

@filename: db.ini

[zyooooxie_db]
user = user_zy
host = host_zy
passwd = passwd_zy
database = database_zy
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""from pymysql.connections import Connection
from pymysql.cursors import Cursor
from pymysql.constants import CLIENTdef read_ini(ini_path: str = 'db.ini'):"""读取配置文件:param ini_path:默认是数据库的配置文件:return:"""if os.path.isfile(ini_path):config = ConfigParser()config.read(ini_path, encoding='UTF-8')return {cf: config.items(cf) for cf in config.sections()}def connect_db(db_name: str) -> (Connection, Cursor):"""建立链接,传参为 具体的db:param db_name::return:"""ini_dict = read_ini()if db_name in ini_dict:res_list = ini_dict.get(db_name)res_dict = dict(res_list)else:raise Exception('传参不合法')db = pymysql.connect(port=3306, charset='utf8', autocommit=True, client_flag=CLIENT.MULTI_STATEMENTS,use_unicode=True, **res_dict)  # client_flag传值:默认可以同时执行多条sql语句的cur = db.cursor()Log.debug('{} connect'.format(db_name))return db, curdef close_db(db: Connection, cur: Cursor):"""断开连接:param db::param cur::return:"""cur.close()db.close()Log.debug('connect close')

exe_sql()、fetch_sql()、fetch_sqls()

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""def exe_sqls(sql: str, db_name: str, db: Connection = None, cur: Cursor = None):"""多条sql语句-execute():param sql::param db_name::param db::param cur::return:"""exe_sql(sql=sql, db_name=db_name, db=db, cur=cur)def exe_sql(sql: str, db_name: str, exe_mode: str = None, data_list: list or tuple = None,db: Connection = None, cur: Cursor = None):"""1条sql语句-execute()、executemany():param sql::param db_name::param exe_mode::param data_list::param db::param cur::return:"""if not bool(cur):db_use, cur_use = connect_db(db_name=db_name)else:db_use, cur_use = db, curLog.info(sql)if data_list is None and exe_mode is None:try_str = """cur_use.execute(sql)"""elif exe_mode == 'execute' and data_list is not None:assert sql.find('(%s') != -1try_str = """cur_use.execute(sql, data_list)"""elif exe_mode == 'executemany' and data_list is not None:assert sql.find('(%s') != -1try_str = """cur_use.executemany(sql, data_list)"""else:Log.error('{}--{}'.format(exe_mode, data_list))raise Exception('Execute Error')try:result = eval(try_str, locals())except Exception as e:db_use.rollback()Log.error(e.args)Log.info(traceback.format_exc())result = FalseLog.error('sql执行有问题')else:execute_sql_result_check(result)finally:if not bool(cur):close_db(db=db_use, cur=cur_use)def execute_sql_result_check(result):"""SQL Execute结果检查:param result::return:"""if not result:Log.error('{}-Number of affected rows'.format(result))else:Log.debug('Execute Succeed:{}'.format(result))def fetch_sqls(sql: str, db_name: str, db: Connection = None, cur: Cursor = None) -> List[tuple]:"""多条sql语句-fetchall():param sql::param db_name::param db::param cur::return:"""if not bool(cur):db_use, cur_use = connect_db(db_name=db_name)else:db_use, cur_use = db, curLog.info(sql)try:data = list()cur_use.execute(sql)data.append(cur_use.fetchall())# while True:##     if cur_use.nextset():#         data.append(cur_use.fetchall())##     else:#         breakwhile cur_use.nextset():data.append(cur_use.fetchall())except Exception as e:db_use.rollback()Log.debug(e.args)Log.info(traceback.format_exc())data = FalseLog.error('sql执行有问题')else:for d in data:fetch_sql_result_check(d)finally:if not bool(cur):close_db(db=db_use, cur=cur_use)return datadef fetch_sql(sql: str, db_name: str, fetch_mode: str = 'fetchall', db: Connection = None, cur: Cursor = None):"""1条sql语句-fetchone()、fetchall():param sql::param db_name::param fetch_mode::param db::param cur::return:"""if not bool(cur):db_use, cur_use = connect_db(db_name=db_name)else:db_use, cur_use = db, curLog.info(sql)if fetch_mode == 'fetchall':try_str = """cur_use.fetchall()"""elif fetch_mode == 'fetchone':  # 很少用到try_str = """cur_use.fetchone()"""else:Log.error('fetch_mode: {}'.format(fetch_mode))raise Exception(fetch_mode)try:cur_use.execute(sql)data = eval(try_str, locals())except Exception as e:db_use.rollback()Log.debug(e.args)Log.info(traceback.format_exc())data = FalseLog.error('sql执行有问题')else:fetch_sql_result_check(data)finally:if not bool(cur):close_db(db=db_use, cur=cur_use)return datadef fetch_sql_result_check(result):"""SQL Fetch结果检查:param result::return:"""if not result:Log.error('{}-Fetch Nothing'.format(result))else:Log.debug('Fetch Succeed')

实际应用【2】

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""def test_0801():from XXX_use.common_mysql import fetch_sql, connect_db, close_db, fetch_sqls, exe_sql, exe_sqlsdb_, cur_ = connect_db(db_name='zy_db')sql = """SELECT  *  FROM `table_c_r`    ORDER BY `update_date` DESC ;"""data = fetch_sql(sql=sql, db_name='zy_db', fetch_mode='fetchall', db=db_, cur=cur_)Log.info(data)data = fetch_sql(sql=sql, db_name='zy_db', fetch_mode='fetchone', db=db_, cur=cur_)Log.info(data)data = fetch_sql(sql=sql, db_name='zy_db', db=db_, cur=cur_)Log.info(data)sql = """SELECT  *  FROM `table_c_r_g_m_s`    ORDER BY `update_date` DESC LIMIT 50 ;# 这条sql查不到数据SELECT  *  FROM `table_c_b_r_r`  WHERE   `delete_flag` = 1   ORDER BY `update_date` DESC  ; SELECT  *  FROM `table_c_r`    ORDER BY `update_date` DESC LIMIT 1;"""res = fetch_sqls(sql=sql, db_name='zy_db', db=db_, cur=cur_)Log.info(res)data_list = [('TEST0801' + 'ZYOOOOXIE_' + str(i), 'Name' + str(i), 'zyooooxie') for i inrandom.sample(range(500), 10)]Log.info(data_list)sql = """insert into `table_c_g_c`     (`c_i`, `name`, `owner`) VALUES   (%s, %s, %s);"""exe_sql(sql=sql, db_name='zy_db', exe_mode='executemany', data_list=data_list, db=db_, cur=cur_)exe_sql(sql=sql, db_name='zy_db', exe_mode='execute', data_list=data_list[-1], db=db_, cur=cur_)sql = """insert into `table_c_g_c`     (`c_i`, `name`, `owner`) VALUES     ('TEST0801ZYOOOOXIE_11','Name_11', 'zyooooxie') ; insert into table_c_y_a    (username, password)values    ('TEST0801_11', 'pwd_11');insert into `table_c_g_c`    (`c_i`, `name`, `owner`) VALUES     ('TEST0801ZYOOOOXIE_12','Name_12', 'zyooooxie') ;    """exe_sql(sql=sql, db_name='zy_db', db=db_, cur=cur_)exe_sqls(sql=sql, db_name='zy_db', db=db_, cur=cur_)sql_ = """DELETE FROM `table_c_g_c` WHERE c_i LIKE 'TEST0801%' ;DELETE FROM `table_c_y_a` WHERE username LIKE 'TEST0801%' ;DELETE FROM `table_c_y_a` WHERE username LIKE 'TEST080808%' ;"""exe_sql(sql=sql_, db_name='zy_db', db=db_, cur=cur_)exe_sqls(sql=sql_, db_name='zy_db', db=db_, cur=cur_)close_db(db_, cur_)

本文链接:https://blog.csdn.net/zyooooxie/article/details/124640412

个人博客 https://blog.csdn.net/zyooooxie

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

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

相关文章

了解IL汇编循环

IL代码, .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 8.entrypoint.locals init (int32, int32)ldc.i4 4stloc.0 //Upper limit of the Loop, total 5 ldc.i4 0 stloc.…

5.文件共享

第四章 文件管理 5.文件共享 ​   假设此时系统中有两个用户User1和User2正在使用硬链接的方式来共享的使用文件1,而另一个用户User3想使用软连接的方式来共享这个文件1,那么User3会建立一个新的文件,这个文件是一个特殊的Link类型的文件&…

数据结构入门:栈

目录 前言 1. 栈 1.1栈的概念及结构 1.2 栈的实现 1.2.1 栈的定义 1.2.2 栈的初始化 1.2.3 入栈 1.2.4 出栈 1.2.5 栈的元素个数 1.2.6 栈顶数据 1.2.7 栈的判空 2.栈的应用 2.1 题目一:括号匹配 2.1.1 思路 2.1.2 分析 2.1.3 题解 总结 前言 无论你是计算机科学专…

算法笔试 java 输入输出练习

在线编程题刷题训练 所有答案 scancer函数的用法 输入输出总结top!!!! java如何调用函数(方法) java刷acm的各种输入输出 vscode配置java环境 子函数的调用,直接定义一个static子函数调用就…

c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

单片机一般采用中断方式接受数据,这样便于及时处理 #include "reg51.h" #include "myheader.h" #define uchar unsigned char int szc[10]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int bufferc[6]{0}; int sza[6]{0x01,0x02,0x0…

46.利用matlab绘制维安尼曲线(matlab程序)

1.代码 clear close all syms s t k u r; x12*sin(s)*cos(t);y12*sin(s)*sin(t);z12*cos(s); x2-2*cos(k)*cos(k);y22*sin(k)*cos(k);z2u; subplot(1,2,1);ezmeshc(x2,y2,z2,[0,pi,-2,2]); %绘制圆柱面 hold on; ezsurf(x1,y1,z1,[-pi,pi,0,pi]); %绘制球面 title( 球面与圆柱…

Windows11中使用OneDrive按Print Screen截屏按键,把截图自动保存到OneDrive中

参考:关于Onedrive 我已经勾选了自动保存屏幕截图 但是我截图之后我的图片并没有上传到onedrive上面 - Microsoft Community 1. 打开Windows 11的设置,可以通过按下Win I键来快速打开设置; 2. 设置--辅助功能--键盘--使用”print Screen“键…

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具,ChatGPT是一种基于人工智能技术的聊天机器人,而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关,部分功能重合,但在很多方面存在着明…

vue中封装自动计算比例滑块

此插件为另一位漂亮的前端同事小姐姐封装,觉得非常好用于是决定记载下来,便于复用 如图需要动态传入需要分配权重的数组,平均分配可以自动将100%平均分给数组中的值 如果手动拖拽,则会自动计算可拖动最大区域,便于最终总权重必定为100% <el-alert class"merge-alert&…

2023国赛数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Spring Boot + Vue3前后端分离实战wiki知识库系统十二--用户管理单点登录开发一...

目标&#xff1a; 在上一次https://www.cnblogs.com/webor2006/p/17533745.html我们已经完成了文档管理的功能模块开发&#xff0c;接下来则开启新模块的学习---用户登录&#xff0c;这块还是有不少知识点值得学习的&#xff0c;先来看一下整体的效果&#xff0c;关于效果官网有…

BUUCTF 还原大师 1

题目描述&#xff1a; 我们得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母&#xff0c;为了确定这个神秘字符串&#xff0c;我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全&#xff0c;E903???4D…

【elementUi】绘制自定义表格、绘制曲线表格

要求绘制下图系列表格&#xff1a; 实现步骤: 1.绘制树&#xff0c;实现树勾选字段—>表格绘制字段 逻辑&#xff1a; 树&#xff1a;check-change“treeChart.handleCheckChange” 绑定点击选择事件&#xff0c;改变data.column3数据项&#xff1b;表格:columns"data…

1. 基于UDP的TFTP文件传输上传下载完整版本

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;…

Install And Understand APISIX(Master the knowledge of APISIX)

Master the knowledge of APISIX Install And Understand APISIX 环境准备 接口服务&#xff1a;gpt 接口服务&#xff08;使用 spring boot 编写的 Chat GPT 接口服务&#xff09; 调用接口示例&#xff1a; 虚拟机软件&#xff1a;VMware Workstation Pro 17 Linux 镜像&…

大数据Flink(六十三):SqlClient工具的使用

文章目录 SqlClient工具的使用 一、​​​​​​​入门

(二分查找) 11. 旋转数组的最小数字 ——【Leetcode每日一题】

❓剑指 Offer 11. 旋转数组的最小数字 难度&#xff1a;简单 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转…

分布式唯一ID实战

目录 一、UUID二、数据库方式1、数据库生成之简单方式2、数据库生成 - 多台机器和设置步长&#xff0c;解决性能问题3、Leaf-segment 方案实现4、双 buffer 优化5、Leaf高可用容灾 三、基于Redis实现分布式ID四、雪花算法 一、UUID UUID的标准形式包含32个16进制数字&#xff…