python连接mysql的相关操作(代码)

该代码定义了一个名为Mysqlutils的类,用于处理与MySQL数据库的连接和交互。类中包含了初始化配置、建立连接、关闭连接、执行查询SQL、执行非查询SQL、批量执行SQL等方法。异常处理通过自定义Throwexception类进行。示例展示了如何插入数据。
摘要由CSDN通过智能技术生成
#!/usr/bin/python
# -*- coding:utf-8 -*-
import datetime

import pymysql


# @Version : 1.0
# @Time    : 2023/4/30 15:09
# @Author  : Ethan
# @File    : Mysqlutils.py
# @Software: PyCharm

class Throwexception(Exception):
    pass


class Mysqlutils(object):

    def __init__(self, application, env_type):
        self.application = application
        self.cnd = {}
        self.env = env_type
        self.isError = None
        self.msg = None

    def init_conf(self):
        try:
            with open(self.application, 'r', encoding='utf-8') as LINES:
                for LINE in LINES:
                    if LINE.find("=") > -1 and LINE.find("#") < 0:
                        item = LINE.strip().strip('\t').strip('\n').split("=")
                        self.cnd.setdefault(item[0].strip(), item[1].strip())
                    else:
                        continue

        except FileNotFoundError as e:
            raise Throwexception(e)

    def init_conn(self):
        data_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.init_conf()
        try:
            conn = \
                pymysql.connect(host=self.cnd.get('MYSQL-U-HOST-{}'.format(self.env))
                                     or exit("MYSQL-U-HOST-{} 失效!".format(self.env)),
                                port=int(self.cnd.get('MYSQL-U-PORT-{}'.format(self.env)))
                                     or exit('MYSQL-U-PORT-{} 失效!'.format(self.env)),
                                user=self.cnd.get('MYSQL-U-USER-{}'.format(self.env))
                                     or exit('MYSQL-U-USER-{} 失效!'.format(self.env)),
                                passwd=self.cnd.get('MYSQL-U-PASSWD-{}'.format(self.env))
                                       or exit('MYSQL-U-PASSWD-{} 失效!'.format(self.env)),
                                database=self.cnd.get('MYSQL-U-DATABASE-{}'.format(self.env))
                                        or exit('MYSQL-U-DATABASE-{} 失效!'.format(self.env)))
            # 设置编码
            cur = conn.cursor()
            cur.execute('SET NAMES utf8;')
            cur.execute('SET character_set_connection=utf8;')

            print('[{}][INFO]: INIT MYSQL CONNECTION SUCCESS'.format(data_now))
            return [conn, cur]
        except ConnectionError as e:
            print('[{}][INFO]: INIT MYSQL CONNECTION FAILED'.format(data_now))
            raise Throwexception(e)

    @staticmethod
    def close_conn(r):
        if r[1]:
            r[1].close()
        if r[0]:
            r[0].close()

    def execute_query_sql(self, sql):
        data_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        try:
            if self.isError:
                return {'msg': self.msg, 'data': None, 'count': 0}
            r = self.init_conn()
            r[0].autocommit(True)
            print('[{}][INFO]: START EXECUTE SQL:{}'.format(data_now, sql))
            sql_start = datetime.datetime.now().timestamp()
            r[1].execute(sql)
            sql_end = datetime.datetime.now().timestamp()
            rcount = r[1].rowcount
            row = r[1].fetchall()
            self.close_conn(r)
            print('[{}][INFO]: EXECUTE SQL FINISHED, Number of affected rows: {}S, execution time: {}'
                  .format(data_now, rcount, sql_end - sql_start))
            return {'msg': 'SUCCEED', 'data': row, 'count': rcount}
        except Exception as e:
            print('[{}][ERROR]: EXECUTE SQL FIELD, PLEASE CHECK YOUR SQL OR OTHER'.format(data_now))
            raise Throwexception(e)

    def execute_sql(self, sql):
        data_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        try:
            if self.isError:
                return {'msg': self.msg, 'data': None, 'count': 0}
            r = self.init_conn()
            r[0].autocommit(True)
            print('[{}][INFO]: START EXECUTE SQL:{}'.format(data_now, sql))
            sql_start = datetime.datetime.now().timestamp()
            r[1].execute(sql)
            sql_end = datetime.datetime.now().timestamp()
            rcount = r[1].rowcount
            self.close_conn(r)
            print('[{}][INFO]: EXECUTE SQL FINISHED, Number of affected rows: {}s, execution time: {}S'
                  .format(data_now, rcount, sql_end - sql_start))
            return {'msg': 'SUCCEED', 'data': ' ', 'count': rcount}

        except Exception as e:
            print('[%s][ERROR]: EXECUTE SQL FIELD, PLEASE CHECK YOUR SQL OR OTHER' % data_now)
            raise Throwexception(e)

    def execute_many_sql(self, sqlps):
        data_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        if len(sqlps) > 0:
            sqm = str(sqlps).strip().strip('\t').strip('\n').rstrip(';').split(';')
            if len(sqm) > 1:
                try:
                    if self.isError:
                        return {'msg': self.msg, 'data': None, 'count': 0}
                    r = self.init_conn()
                    print('[{}][INFO]: START EXECUTE BATCH SQL: (NUM SQL:{})'.format(data_now, len(sqm)))
                    batch_sql_start = datetime.datetime.now().timestamp()
                    # 提供计数
                    row_index = 1
                    rows = []
                    start_row = 0
                    t_index = 1
                    for index in range(len(sqm)):
                        try:
                            print('[{}][INFO]: START EXECUTE {} SQL: {}'.format(data_now, row_index, sqm[index]))
                            sql_start = datetime.datetime.now().timestamp()
                            r[1].execute(sqm[index])
                            sql_end = datetime.datetime.now().timestamp()
                            rcount = r[1].rowcount
                            print('[{}][INFO]: EXECUTE SQL FINISHED, Number of affected rows: {}, execution time: {}S'
                                  .format(data_now, rcount, sql_end - sql_start))
                            rows.append({'msg': 'SUCCEED', 'data': ' ', 'count': rcount})
                            if row_index >= 100 * t_index:
                                t_index += 1
                                end_row = row_index
                                r[0].commit()
                                self.close_conn(r)
                                r = self.init_conn()
                                print("[{}][INFO]: 批量执行SQL,第{}个到第{}个提交完成!".format(data_now, start_row, end_row))
                                start_row = end_row
                            else:
                                row_index += 1
                        except Exception as e:
                            raise Throwexception(e)
                    batch_sql_end = datetime.datetime.now().timestamp()
                    # 批量执行完再提交
                    r[0].commit()
                    self.close_conn(r)
                    print("[{}][INFO]: 批量执行SQL,第{}个到第{}个提交完成!".format(data_now, start_row, len(sqm)))
                    print('[{}][INFO]: EXECUTE BATCH SQL FINISHED,execution time: {}S'.format(
                        data_now, (batch_sql_end - batch_sql_start)))
                    return rows
                except Exception as e:
                    raise Throwexception(e)
            else:
                self.execute_sql(sqm[0])
        else:
            print("[{}][INFO]: SQL IS NULL! PEALACE CHECK YOUR SQL".format(data_now))

    def execute_sql_batch(self, sql, datalist):
        data_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        try:
            if self.isError:
                return {'msg': self.msg, 'data': None, 'count': 0}
            r = self.init_conn()
            start_time = datetime.datetime.now().timestamp()
            r[1].executemany(sql, datalist)
            rcount = r[1].rowcount
            end_time = datetime.datetime.now().timestamp()
            print('[{}][INFO]: EXECUTE SQL FINISHED, Number of affected rows: {}, execution time: {}S'
                  .format(data_now, rcount, end_time - start_time))
            return {'msg': 'SUCCEED', 'data': ' ', 'count': rcount}
        except Exception as e:
            raise Throwexception(e)

    def excute_sql_txt(self, execute_type, file):

# 测试
if __name__ == '__main__':
    mut = Mysqlutils("D:\workspace\python\com.wz\\test", '100')
    sql = []
    for index in range(210):
        sql.append("insert into test values({},'xiaohu{}','qqxiaoxue');".format(index, index))

    print(str(sql).replace('[', '').replace(']', '').replace(';",', '";'))
    mut.execute_many_sql(str(sql).replace('[', '').replace(']', '').replace(';",', ';').replace('"',''))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值