Python脚本之操作MySQL【一】

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

之前曾经写过 连接MySQL【二】连接MySQL【一】,最近对我的代码做了些优化,想着做些分享;

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

Cursor类的execute()、executemany()

往表里造数据时,我常常用到这2个方法;

以前在使用execute() 都是直接传了 我要执行的sql,偶然看了下源码,才发现 和executemany() 有点相似,都有args。

execute()

在这里插入图片描述

executemany()

在这里插入图片描述

所以,就把自己写的 公共方法做了优化,然后发现 实际调用这些方法时,很多造数方法 也得优化,干脆就全部优化一遍了。

代码

公共方法

(代码有删改)

@File: common_mysql.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""


import pymysql
import traceback
from pymysql.connections import Connection
from pymysql.cursors import Cursor
from user_log import Log


def connect_db(**kwargs):
    """
    数据库链接,传参为 具体的db
    :param kwargs:
    :return:
    """

    if kwargs.get('ABC_db'):
        mysql_user = ''
        mysql_host = ''
        mysql_pwd = ''
        mysql_db = ''

    elif kwargs.get('abc_db'):
        mysql_user = ''
        mysql_host = ''
        mysql_pwd = ''
        mysql_db = ''


    else:
        raise Exception('传参不合法')

    db = pymysql.connect(host=mysql_host, passwd=mysql_pwd, user=mysql_user, port=3306, autocommit=True,
                         database=mysql_db, charset='utf8', use_unicode=True)
    cur = db.cursor()

    return db, cur


def execute_sql_no_args_no_close(sql: str, db: Connection, cur: Cursor):
    """
    execute() 没有args
    :param sql:
    :param db:
    :param cur:
    :return:
    """
    Log.debug(sql)

    try:
        result = cur.execute(sql)

    except Exception as e:
        db.rollback()
        Log.debug(e.args)
        Log.info(traceback.format_exc())
        result = False

    execute_sql_result_check(result)


def execute_sql_no_close(data_list_tuple: list or tuple, sql: str, db: Connection, cur: Cursor):
    """
    execute() 要传args
    :param data_list_tuple:
    :param sql:
    :param db:
    :param cur:
    :return:
    """
    Log.debug(sql)

    try:
        assert sql.find('(%s') != -1

        # %s可以用作查询中的占位符
        # If args is a list or tuple, %s can be used as a placeholder in the query.

        result = cur.execute(sql, data_list_tuple)

    except Exception as e:
        db.rollback()
        Log.debug(e.args)
        Log.info(traceback.format_exc())

        result = False

    execute_sql_result_check(result)


def executemany_sql_no_close(data_list: list, sql: str, db: Connection, cur: Cursor):
    """
    executemany() 要传args
    :param data_list:
    :param sql:
    :param db:
    :param cur:
    :return:
    """
    Log.debug(sql)

    try:
        db.ping(reconnect=True)

        assert sql.find('(%s') != -1
        result = cur.executemany(sql, data_list)

    except Exception as e:
        db.rollback()
        Log.debug(e.args)
        Log.info(traceback.format_exc())

        result = False

    execute_sql_result_check(result)


def execute_sql_result_check(result):
    """

    :param result:
    :return:
    """
    Log.debug(result)
    if result is False:
        Log.error('Execute Fail')
        raise
    else:
        assert isinstance(result, int) is True
        Log.debug('Execute Succeed')


def fetchall_data_no_close(sql: str, db: Connection, cur: Cursor):
    """
    fetchall()
    :param sql:
    :param db:
    :param cur:
    :return:
    """
    Log.debug(sql)

    try:
        cur.execute(sql)
        data = cur.fetchall()
    except Exception as e:
        db.rollback()
        Log.debug(e.args)
        Log.info(traceback.format_exc())

        data = False

    fetch_sql_result_check(data)

    return data


def fetchone_data_no_close(sql: str, db: Connection, cur: Cursor):
    """
    fetchone()
    :param sql:
    :param db:
    :param cur:
    :return:
    """
    Log.debug(sql)

    try:
        cur.execute(sql)
        data = cur.fetchone()

    except Exception as e:
        db.rollback()

        Log.debug(e.args)
        Log.info(traceback.format_exc())

        data = False

    fetch_sql_result_check(data)
    return data


def fetch_sql_result_check(result):
    """

    :param result:
    :return:
    """
    Log.debug(result)

    if result is False:
        Log.error('Fetch Fail')
        raise

    elif not bool(result):
        Log.error('Fetch None')

    else:
        Log.debug('Fetch Succeed')
		

方法优化

公共方法中 execute_sql_no_close() 和 executemany_sql_no_close() 、fetchone_data_no_close()和fetchall_data_no_close() 大部分代码一样,还可以再优化下;

"""
@blog: https://blog.csdn.net/zyooooxie
"""

def exe_sql(sql: str, db: Connection, cur: Cursor, exe_mode: str = None, data_list: list = None):
    Log.debug(sql)

    if data_list is None and exe_mode is None:
        try_str = """cur.execute(sql)"""

    elif exe_mode == 'execute' and data_list is not None:
        assert sql.find('(%s') != -1
        try_str = """cur.execute(sql, data_list)"""

    elif exe_mode == 'executemany' and data_list is not None:
        assert sql.find('(%s') != -1
        try_str = """cur.executemany(sql, data_list)"""

    else:
        Log.error('{}--{}'.format(exe_mode, data_list))
        raise

    try:
        result = eval(try_str, locals())

    except Exception as e:
        db.rollback()
        Log.debug(e.args)
        Log.info(traceback.format_exc())
        result = False

    execute_sql_result_check(result)


def fetch_sql(sql: str, db: Connection, cur: Cursor, fetch_mode: str):
    Log.debug(sql)

    if fetch_mode == 'fetchall':
        try_str = """cur.fetchall()"""

    elif fetch_mode == 'fetchone':
        try_str = """cur.fetchone()"""

    else:
        Log.error('fetch_mode: {}'.format(fetch_mode))
        raise

    try:
        cur.execute(sql)
        data = eval(try_str, locals())

    except Exception as e:
        db.rollback()

        Log.debug(e.args)
        Log.info(traceback.format_exc())

        data = False

    fetch_sql_result_check(data)
    return data
    

实际应用

(代码有删改)

@File: send_gift.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""

def test_delete_all_data(user_id: str = 'zyooooxie'):
    """
    
    :param user_id:
    :return:
    """

    db_zy, cur_zy = connect_db(zy_db='YES')
    
    exe_sql("""DELETE FROM table_records  WHERE USER_ID = '{}';""".format(user_id), db_coupon, cur_coupon)
    exe_sql("""DELETE FROM table_records_detail  WHERE USER_ID = '{}';""".format(user_id), db_coupon, cur_coupon)

    # execute_sql_no_args_no_close("""DELETE FROM table_records  WHERE USER_ID = '{}';""".format(user_id), db_coupon, cur_coupon)
    # execute_sql_no_args_no_close("""DELETE FROM table_records_detail  WHERE USER_ID = '{}';""".format(user_id), db_coupon, cur_coupon)


    Log.info('数据已经清理-{}'.format(user_id))

    cur_zy.close()
    db_zy.close()

@filename: create_order.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""


def test_data2(db: Connection, cur: Cursor, user_id: str = 'zyooooxie'):
    """
    造支付记录-详情
    :param db:
    :param cur:
    :param user_id:
    :return:
    """
    sql1 = """SELECT COUNT(1) FROM table_pay_record; """
    
    # sql_data = fetchone_data_no_close(sql1, db, cur)
    sql_data = fetch_sql(sql1, db, cur, fetch_mode='fetchone')

    sql_data = sql_data[0]
    record_id = int(sql_data) + 1
    Log.info(f'{record_id}')

    sql2 = """ SELECT package_code, package_name_cn, price FROM table_package ; """
    # data = fetchall_data_no_close(sql2, db, cur)
    data = fetch_sql(sql2, db, cur, fetch_mode='fetchall')

    data = random.choice(data)
    Log.info(data)

    ele = data if len(data[1]) < 40 else (data[0], data[1][:35], data[2])           # `package_name` varchar(40)
    res = record_id, user_id, *ele

    Log.info(res)
    return res


def test_insert(db: Connection, cur: Cursor, user_id: str = 'zyooooxie',
                mobile: str = '17777777777'):
    """

    :param db:
    :param cur:
    :param user_id:
    :param mobile:
    :return:
    """

    data2 = test_data2(db, cur, user_id=user_id)

    sql2 = """INSERT INTO table_pay_record_detail (record_id, user_id, package_code, package_name, package_price, receive_status,verification) VALUES (%s, %s, %s, %s, %s, %s, %s); """
    receive_status = random.randint(1, 6)
    verification = 1

    data2 = *data2, receive_status, verification

    # execute_sql_no_close(data2, sql2, db, cur)
    exe_sql(sql2, db, cur, exe_mode='execute', data_list=data2)    
    Log.info('数据插入完成')


def test_main():
    """

    :return:
    """
    db_m, cur_m = connect_db(hk_cemposea_db='YES')

    for _ in range(10):
        test_insert(db_m, cur_m)

    else:

        cur_m.close()
        db_m.close()

"""
@blog: https://blog.csdn.net/zyooooxie
"""

def test_1(package_code: str = 'zyooooxie'):
    """
	造订单数据-为了方便在管理后台查到,userId、phone写死
    :param package_code:
    :return:
    """
    db_m, cur_m = connect_db(hk_cemposea_db='YES')
	
    sql = """ SELECT package_name_cn,coupon_effect_tm_st,coupon_effect_tm_end FROM table_package WHERE status = 1 AND package_code = '{}'; """.format(package_code)

    # op_data = fetchone_data_no_close(sql, db_m, cur_m)
    op_data = fetch_sql(sql, db_m, cur_m, fetch_mode='fetchone')

    sql = """SELECT coupon_code, check_code FROM table_package_coupon WHERE package_code = '{}' AND create_by = 'zyooooxie'; """.format(package_code)
    
    # opc_data = fetchall_data_no_close(sql, db_m, cur_m)
    opc_data = fetch_sql(sql, db_m, cur_m, fetch_mode='fetchall')

    coupon_code, check_code = zip(*opc_data)        # 生成2个元组

    order_code = 222222222222222222
    abc = random.randint(1000, 9999)
    order_code_list = [order_code + (i+1) * abc for i in range(len(opc_data))]

    zip_data = [op_data] * len(opc_data)
    commodity_name, order_start_time, order_end_time = zip(*zip_data)

    sql = """INSERT INTO table_order (order_code, user_id, phone_number, order_time, commodity_name,coupon_code,check_code,order_start_time,order_end_time,commodity_code,order_status) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s); """
	
    dt = datetime.datetime.now()
    all_data = list(zip(order_code_list, ['zyooooxie'] * len(opc_data), ['zyooooxie'] * len(opc_data),
                        [dt] * len(opc_data), commodity_name, coupon_code, check_code, order_start_time, order_end_time, [package_code] * len(opc_data), [0] * len(opc_data)))

    # executemany_sql_no_close(all_data, sql, db_m, cur_m)
    exe_sql(sql, db_m, cur_m, exe_mode='executemany', data_list=all_data)

    Log.info('数据插入完成')
    cur_m.close()
    db_m.close()

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值