自写Python操作MySQL模块(二次封装)

python操作mysql数据库 python操作数据库的过程: 创建连接—获取游标—执行命令—关闭游标—关闭连接 python访问mysql要用pymysql库 pymysql需要安装:pip install pymysql 导入pymysql 阅读详情

前置基础知识

  1. Python 操作 MySQL 基础
  2. Python任意字典写入MySQL
  3. pandas读MySQL数据并存为Excel

封装成类(Python3版本)

from pymysql import Connection
from my_utils import Timer  # https://blog.youkuaiyun.com/Yellow_python/article/details/80723272


class Mysql(Timer):
    def __init__(self, **kwargs):
        super().__init__()
        self.database = kwargs.pop('database')
        self.db = Connection(
            user=kwargs.pop('user', 'root'),
            password=kwargs.pop('password'),
            host=kwargs.pop('host', 'localhost'),
            database=self.database,
            port=kwargs.pop('port', 3306),
            charset=kwargs.pop('charset', 'UTF8'),
        )
        self.cursor = self.db.cursor()

    def __del__(self):
        self.cursor.close()
        self.db.close()

    def commit(self, sql):
        self.debug(sql)
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            print(e)

    def fetchall(self, query):
        self.cursor.execute(query)
        return self.cursor.fetchall()  # 有数据:tuple of tuple;无数据:()

    def fetchone(self, query, n=9999999):
        print(query)
        self.cursor.execute(query)
        for _ in range(n):
            one = self.cursor.fetchone()  # tuple
            if one:
                yield one

    def fetchone_dt(self, query, n=9999999):
        print(query)
        rowcount = self.cursor.execute(query)
        columns = [i[0] for i in self.cursor.description]
        length = len(columns)
        for _ in range(min(n, rowcount)):
            one = self.cursor.fetchone()  # tuple
            yield {columns[i]: one[i] for i in range(length)}

    def insert(self, dt, tb):
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'INSERT %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.commit(sql)

    def update(self, dt, dt_condition, tb):
        sql = 'UPDATE %s SET ' % tb + ','.join('%s=%r' % (k, v) for k, v in dt.items()) \
              + ' WHERE ' + ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        self.commit(sql)

    def insert_or_update(self, dt, dt_condition, tb):
        """有则更新,无则插入"""
        query = 'SELECT * FROM ' + tb + ' WHERE ' + \
                ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        if self.fetchall(query) == ():
            dt.update(dt_condition)
            self.insert(dt, tb)
        else:
            self.update(dt, dt_condition, tb)

    def replace(self, dt, tb):
        """
        若存在相同数据,会先删除,再重新插入
        缺点:
            1、需要考虑全部数据列,不然会丢失部分列
            2、索引的原因,导致插入效率较低
        """
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'REPLACE INTO %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.commit(sql)

    def truncate(self, tb):
        sql = 'TRUNCATE TABLE %s' % tb
        self.commit(sql)

生成Excel模块

import pandas as pd  # conda install pandas openpyxl


class Excel(Mysql):
    def postfix(self, prefix):
        """导出Excel文件后缀名"""
        return prefix.replace('.xlsx', '') + '_{}.xlsx'.format(self.today)

    def db2sheet(self, query, prefix=''):
        """
        保存为单sheet的Excel文件
        :param query: 数据库查询语句
        :param prefix: 文件名前缀
        """
        df = pd.read_sql_query(query, self.db)
        if prefix:
            df.to_excel(self.postfix(prefix), index=False)
        return df

    def db2sheets(self, queries, prefix):
        """
        保存为多sheets的Excel文件
        :param queries: 字典{sheet名:sql}
        :param prefix: 文件名前缀
        """
        writer = pd.ExcelWriter(self.postfix(prefix))
        for sheet_name, query in queries.items():
            df = pd.read_sql_query(query, self.db)
            # if 'url' in df.columns:df['url'] = "'" + df['url']
            df.to_excel(writer, sheet_name=sheet_name, index=False)
        writer.save()

    def tb2sheet(self, tb):
        self.db2sheet('SELECT * FROM ' + tb, tb)

简单统计模块

class Analysis(Mysql):
    def show_tables(self):
        """所有表的名字、数据量、表注释,数据量更新有延时"""
        for i in self.fetchone("""SELECT TABLE_NAME,TABLE_ROWS,TABLE_COMMENT
        FROM information_schema.TABLES WHERE TABLE_SCHEMA='%s' """ % self.database):
            print(*i, sep='   ')

    def show_create_table(self, tb=''):
        """查看表注释"""
        if tb:
            tb = tb.upper()
            self.yellow('表注释')
            sql = "SELECT TABLE_COMMENT FROM information_schema.TABLES WHERE table_name='%s'" % tb
            print(self.fetchall(sql)[0][0])
            self.yellow('字段注释')
            sql = "SELECT COLUMN_NAME,COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME='%s'" % tb
            for i in self.fetchall(sql):print(i)
            self.yellow('建表语句')
            sql = "SHOW CREATE TABLE " + tb
            print(self.fetchall(sql)[0][1])
        else:
            sql = "SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT FROM information_schema.COLUMNS"
            for i in self.fetchall(sql):print(i)

    def count(self, tb):
        return self.fetchall('SELECT COUNT(*) FROM ' + tb)[0][0]

    def proportion_not_null(self, table, field=None):
        """非空占比"""
        if field:
            sql = '''
            SELECT
                t1.f1 amount,
                t1.f1/t2.f1 proportion
            FROM
                (SELECT COUNT(*)f1 FROM {table} WHERE "{field}" IS NOT NULL)t1,
                (SELECT COUNT(*)f1 FROM {table})t2
            '''.format(table=table, field=field.upper())
            result = self.fetchall(sql)[0]
            print(field.rjust(15, ' '), self.hot(round(result[1]*100, 2), 50)+'%', result[0], sep=' '*5)
            return [field, *result]
        else:
            sql = "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name='%s'" % table
            return [self.proportion_not_null(table, i)for i, in self.fetchall(sql)]

    def proportion_group_by(self, table, field, prints=''):
        """单字段各项占比"""
        sql = '''
        SELECT
            t1.f2 fullname,
            t1.f1 amount,
            t1.f1/t2.f1 proportion
        FROM
            (SELECT COUNT(*)f1,"{field}" f2 FROM {table} GROUP BY "{field}")t1,
            (SELECT COUNT(*)f1 FROM {table})t2
        ORDER BY amount DESC
        '''.format(table=table, field=field.upper())
        result = self.fetchall(sql)
        for i, j, k in prints and result:
            print('{}'.format(i).rjust(15, ' '), self.hot(round(k*100, 2), 50)+'%', j, sep=' '*5)
        return result

文本挖掘模块

class TM(Mysql):  # Text Mining
    def highlight_print(self, field, table, keyword, n=500):
        """查询+高亮"""
        sql = "SELECT %s FROM %s WHERE INSTR(%s,'%s')>0" % (field, table, field, keyword)
        for text, in self.fetchone(sql, n):
            print(self.highlight(text, keyword))

    def highlight_cut(self, field, table, keyword, n=500, length=50):
        """查询+分词+高亮"""
        from jieba import dt
        sql = "SELECT %s FROM %s WHERE INSTR(%s,'%s')>0" % (field, table, field, keyword)
        dt.add_word(keyword)
        for text, in self.fetchone(sql, n):
            for word, head, tail in dt.tokenize(text):
                if word == keyword:
                    highlight_word = self.dark_red(keyword)
                    print(text[max(head-length, 0):head] + highlight_word + text[tail:tail+length])

    def group_by_count(self, field, table):
        """查数量,降序"""
        sql = 'SELECT %s,count(*) as cnt FROM %s GROUP BY %s ORDER BY cnt DESC' % (field, table, field)
        return self.fetchall(sql)

封装成类(Python2版本)

Python2的优势是免安装
脚本执行所在的服务器上安装了MySQL,就可执行mysql+-e,例如:
mysql -u"用户" -p"密码" -D"库名" -e"INSERT t1(f1,f2)VALUES('a',3)"

# coding=utf-8
from subprocess import check_output


def evaluate(cmd):
    """执行Linux命令并获取返回值,Python2返回值类型为str"""
    print cmd
    return check_output(cmd, shell=True).strip()


class Mysql:
    def __init__(self, **kwargs):
        host = kwargs.pop('host', 'localhost')
        user = kwargs.pop('user', 'root')
        password = kwargs.pop('password')
        database = kwargs.pop('database', None)
        self.cmd = "mysql -h'{}' -u'{}' -p'{}' ".format(host, user, password)
        if database:
            self.cmd += '-D"{}" '.format(database)

    def e(self, sql):
        return evaluate(self.cmd + "-e'{}'".format(sql.replace("'", '"')))

    def fetch_dt(self, sql):
        lines = self.e(sql).split('\n')
        if len(lines) > 1:
            columns = lines[0].split('\t')
            col_num = len(columns)
            for line in lines[1:]:
                cells = line.split('\t')
                yield {columns[i]: cells[i] for i in range(col_num)}

    def insert(self, dt, tb):
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'INSERT %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        print sql
        self.e(sql)

    def update(self, dt, dt_condition, tb):
        sql = 'UPDATE %s SET ' % tb + ','.join('%s=%r' % (k, v) for k, v in dt.items()) \
              + ' WHERE ' + ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        self.e(sql)

    def replace(self, dt, tb):
        """
        若存在相同数据,会先删除,再重新插入
        缺点:
            1、需要考虑全部数据列,不然会丢失部分列
            2、索引的原因,导致插入效率较低
        """
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'REPLACE INTO %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.e(sql)


if __name__ == '__main__':
    PWD = '123456'
    Mysql(password=PWD).e('CREATE DATABASE b1;')
    _m = Mysql(password=PWD, database='b1')
    _m.e('''
    CREATE TABLE t1(
    a INT PRIMARY KEY,
    b VARCHAR(255),
    c DATETIME DEFAULT NOW())
    ''')
    _m.insert({'a': 234, 'b': 'ABC', 'c': evaluate('date +"%Y-%m-%d %H:%M:%S"')}, 't1')
    _m.insert({'a': 222, 'b': 'EEE'}, 't1')
    _m.update({'b': 'FFF'}, {'a': 234}, 't1')
    for _d in _m.fetch_dt('SELECT * FROM t1'):
        print _d
flask向MySQL封装_Python3 从零单排14_flask模块&mysql操作封装 1.flask模块介绍在测试的过程中,往往会遇到功能受接口影响而导致测试无法正常进行,往往要等接口完成之后才能做功能测试,但这往往很托节奏。这个时候就可以考虑,将接口和功能剥离,分开测试,同时进行,保证项目进度。问题是怎么分开呢?要研发先帮忙开发接口、调试好,然后测试?显然太low,python这个时候就可以来装一波X,我们自己动手按照需求开发一套接口来供功能测试,其第三方模块flask提供接口服... 阅读详情

相关推荐

科研绘图必备:Adobe Illustrator 高效排版技巧全解析

本文详细解析了Adobe Illustrator在科研绘图中的高效排版技巧,帮助科研人员提升论文图表质量。从图片预处理、统计图表优化到精准对齐和期刊投稿前的终极检查,全面覆盖AI在科研绘图中的关键应用场景,确保图表符合期刊要求,提升投稿成功率。

weixin_26767391的博客 345

python——MySQL封装操作

【代码】python——MySQL封装操作。

python全栈 4070

[cadence]Allegro STEP-3D模型导入、匹配、导出的方法及注意事项

如果 Avaliable里面没有和symbols对应的文件,说明没有对应的3D模型,这时候需要在你的step路径下创建y与 .dra 封装文件相同名称的。选择好 Output file 和 name 之后呢,点击 Export。首先打开Setup - Step Package Mapping。注意:路径中不能有中文名称,有的话你会发现不能导出,也不会报错。在路径下将下载或者自己做的 3D模型文件改名之后,重新打开。可在View -> 3D View。

LuDvei的博客 2万+

python -- pymysql库封装

pymsql是第三方库,用于连接mysql。直接命令即可安装:pip install pymsql安装后可能会提示:Read timed out ,再次输入安装即可。

qq_42873925的博客 1425

Vivado实战:UltraScale/UltraScale+器件eFUSE寄存器配置与安全编程全解析

本文详细解析了Xilinx UltraScale/UltraScale+器件中eFUSE寄存器的配置与安全编程方法。从芯片唯一身份标识到加密密钥烧录,再到用户寄存器的灵活应用和安全控制寄存器的配置技巧,全面介绍了如何利用eFUSE功能提升硬件安全性。文章还提供了JTAG接口安全管理和NKZ文件备份方案,帮助开发者避免常见陷阱,确保安全编程的可靠性。

weixin_42535703的博客 431

YOLOv11改进 | Conv篇 | 图像去雾卷积DEConv助力yolov11有效涨点(部署零额外开销)

本文介绍了一种最新改进机制用于低层视觉任务的细节增强卷积(DEConv)机制。DEConv在训练阶段采用"普通卷积+差分卷积"的多分支并联结构,增强网络对边缘、纹理等细节特征的学习能力;在推理阶段可折叠为标准3×3卷积,保持与普通卷积相同的计算效率。文中详细阐述了DEConv的工作原理、实现方法以及在YOLOv11中的应用步骤,包括核心代码解析、模型修改方法和训练配置。实验表明,该机制在去雾、去噪、超分等强调细节重建的任务中具有显著优势。文章还提供了完整的代码实现和训练指导.

Snu77的博客 2441

Python操作Mysql的简单封装

文章目录一、安装依赖二、实现类 一、安装依赖 pip install mysqlclient 二、实现类 # encoding: utf-8 # sql导出 # mysqldump -u root -p db_name > test_db.sql import MySQLdb class MySqlOp(object): def __init__(self, host, port, username, password, db): self.host = host

什么都干的派森 3030

【webrtc】openh264编码:动态配置码控参数触发IDR编码

SetRates 下发RateControlParameters 给到openh264 编码器 void SetRates(const RateControlParameters& parameters) override; LayerConfig 编码器这边的配置是layerconfig,具体到层的: std::vector<LayerConfig> configurations_; void H264EncoderImpl::SetRates(const RateCo.

突围 726

Python封装mysql数据库

写一个MySQL的操作类,避免每次重复编写代码,开箱即用。

ann_2006的博客 841

AI大模型:(三)3.9 Deep Agents实现Agent

DeepAgents是基于LangChain的智能体框架,专为复杂长期任务设计。其通过分层架构解决传统局限,提供智能规划、虚拟文件系统、权限控制、任务委派、上下文管理、人机协同、模型适配及技能系统八大核心功能。相比基础LangChain,它内置状态持久化、流式处理和子智能体调度,显著提升可靠性与自主性。典型应用涵盖自动化编程、复杂业务流程编排及持续学习型研究助手。该框架支持多智能体协作,具备路由分发与动态技能加载能力,适用于需高自主性与安全控制的AI场景,有效实现从代码分析到人工审批的全流程自动化管理。

haylee的专栏 444

matlab 显示曲面网格【2025最新版】

matlab点云工具箱对点云三维重建结果显示的函数。博客长期更新,本文最近更新时间为:2025年9月14日。

点云侠的博客 2581

Python 操作MySql数据库(封装、优雅)

python操作mysql数据库,对mysql进行封装。这里只涉及了单表的增、删、查、改这些简单地封装操作,便于对简单的sql语句进行快速使用。

qq_59142194的博客 7971

从 SM59 到 SPROXY,打通 ABAP 后端与 ES Repository 的代理生成链路

本文探讨了在SAP PI/PO项目中配置ABAP后端系统与ES Repository连接的关键步骤,重点解决ABAP Proxy生成时无法获取接口模型的问题。文章指出: 该配置本质是建立设计时通道,使ABAP系统能通过SPROXY访问ES Repository中的接口模型并生成代理类 配置核心是在SM59创建名为SAP_PROXY_ESR的HTTP连接(类型G),需确保: 目标路径为/rep 使用具备SAP_XI_IS_SERV_USER角色的服务账号 连接测试通过后仍需在SPROXY中验证完整功能 常见陷

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 64

Python——操作MySQL数据库

pymysql是一个Python库,用于连接MySQL数据库并执行SQL语句。它是基于MySQLdb的升级版,支持Python3.x和MySQL5.x及以上版本。pymysql提供了简单易用的API,可以方便地进行数据库操作,如连接数据库、执行SQL语句、获取查询结果等。pymysql还支持事务处理、连接池、数据库连接监控等功能,可以满足不同场景的需求。

小田是个程序员的博客欢迎你的到来呀~ 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python 封装 MySQL 操作

封装 MySQL 操作可以让你的代码更加模块化、可重用,并且更容易维护。通过封装,你可以将与数据库交互的细节隐藏起来,对外提供一个简洁的接口。

software_test010的博客 934

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python操作MySql类封装

最近用到Python操作数据库,除了SQLSERVER操作封装类https://blog.youkuaiyun.com/sinat_28984567/article/details/105342874,还有MySql的操作需求,简单写了一个Mysql封装操作类,分享一下,需要安装pymsql,安装方法:https://blog.youkuaiyun.com/sinat_28984567/article/de...

二月十六的博客 4029

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python 对MySQL操作封装工具类

在Python中对MySQL的操作通常通过或PyMySQL库进行,以下是一个简单的对MySQL操作的封装示例,使用。你可以根据实际需求选择适合的库。

cheng_ji的专栏 979

优雅操作MySQL:Python封装高可用MySQL工具类详解

本文介绍了一个基于Python的MySQL工具类MySQLUtils的封装,旨在简化数据库操作并提高代码复用性。文章首先分析了原生pymysql库在实际开发中的痛点,包括繁琐的连接管理、易错的事务处理、SQL注入风险等问题。随后详细展示了工具类的完整实现,核心功能包括: 自动化的连接管理(通过上下文管理器实现) 安全的事务处理机制(自动提交/回滚) 防SQL注入的参数化查询 字典格式的结果返回(提高可读性) 完善的错误日志记录 文章还提供了实战示例和进阶优化建议,如连接池管理、批量操作扩展等。该工具类特别适

漫画之迷学编程 1308

Python操作之MySQL

在使用Python中我们都要安装相关的库,mysql在python经常使用的库为PyMySQL,安装如下:流程图如下:实例代码如下: 创建表格 在我们使用数据库之前,首先我们得有数据库,那么如何创建呢?如下:在python中我们通过`connect`函数连接 MySQL 服务器,该函数会返回一个`Connection`对象但是为了让程序更加健壮,我们一般不会这样调用该函数,先不说麻烦与否,如果我们经常要修改连接参数,那么我们所有调用地方都会修改,这样的代码十分不健壮。所以我们应该使用模块化进行解决,代

sanylove的博客 6287

python mysql操作封装库_python对mysql操作封装

python 对MySQL操作进行封装后面直接拿来用就okimport pymysqlclass MysqlManager(object):'''mysql管理器'''def __init__(self, db, user, passwd, host='localhost', port=3306, charset='utf8'):'''初始化数据库'''self.__db = dbself.__u...

weixin_39872334的博客 134

python mysql操作封装库_python 对MySQL操作进行封装

python 对MySQL操作进行封装后面直接拿来用就okimport pymysqlclass MysqlManager(object):'''mysql管理器'''def __init__(self, db, user, passwd, host='localhost', port=3306, charset='utf8'):'''初始化数据库'''self.__db = dbself.__u...

weixin_39622419的博客 240

python连接mysql与sql server数据库及相应的模块封装

一、Python连接MySQL数据库及模块封装 1、连接模块封装 步骤:首先建立名为“db_sql” 的文件夹,在文件夹下再建立名为“db_mysql”的“.py"文件,在改文件下编辑如下代码”: import pymysql import pandas as pd def execute_sql(sql): localhost = "72.106.100.12" us...

weixin_38627015的博客 1836

Python操作Mysql麻烦,敢不敢自己封装一个包可好?

待我代码写成,便娶你为妻!数据分析免不了使用Python操作Mysql,直接操作Mysql的表,对其进行操作;或者直接将Python中的数据集统计的结果保存到Mysql。...

大数据技术派 449

【Python】Python操作MySQL详解——PyMySQL

PyMySQL模块简介 纯Python实现的模块,可以与Python代码兼容衔接,并也几乎兼容MySQL-python。遵循 Python 数据库 API v2.0 规范。安装PyMySQL需要满足以下需求。

会飞的大象 1万+

Python3操作MySQL基于PyMySQL封装的类

在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类,基于PyMySQL库在Python3上实现。在写业务逻辑代码的时候,可以方便很多,时间关系,没有写太完善,只写了常用的操作。 直接上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- 'Python连接到 My...

weixin_45716111的博客 1173

python操作mysql数据库基本类封装

python操作mysql数据库基本类封装 本文是在博主cxl283的博客下https://blog.youkuaiyun.com/cxl283/article/details/73521831稍微修改而来的。 修改的地方: 1、python2变成python3 2、MySQLdb 变成pymysql 两者变化不大。 import re import pymysql """ connect连接对象的方法: ...

huangwencai123的博客 1156
上一篇: 【极简】实体识别和消歧
下一篇: Oracle Client(配环境+代码+报错+Python连接)
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值