# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test63
# FileName:      db.py
# Author:       lao_zhao
# Datetime:     2024/11/5 14:22
# Description:
# 
# ---------------------------------------------------------------------------
import pymysql

from APIAutoTest_v3_1 import log
from APIAutoTest_v3_1.common.read_basic_ini import ReadBasicIni


class DB:
    def __init__(self):
        """链接数据库"""
        ini = ReadBasicIni()
        try:
            self.conn = pymysql.connect(
                host=ini.get_connect_sql_msg("host"),
                port=int(ini.get_connect_sql_msg("port")),
                user=ini.get_connect_sql_msg("user"),
                password=ini.get_connect_sql_msg("pwd"),
                database=ini.get_connect_sql_msg("database"),
                charset="utf8"
            )
            self.cursor = self.conn.cursor()
        except Exception as e:
            log.error(f"链接数据库时出错，请求检查ini配置文件，发生的错误类型为：{type(e)}, 错误的描述为：{e}")
            raise e

    def delete(self, sql_sentence):
        """执行删除的sql语句"""
        log.info(f"执行的方法为：delete，功能描述为：执行删除的sql语句，传入的参数为：{sql_sentence}")
        if isinstance(sql_sentence, str) and sql_sentence.strip().lower().startswith("delete"):
            try:
                self.cursor.execute(sql_sentence)
                self.conn.commit()
            except Exception as e:
                log.error(
                    f"执行的方法为：delete，功能描述为：执行删除的sql语句，传入的参数为：{sql_sentence}, 错误类型为：{type(e)}, 错误的描述为：{e}")
                raise e
        else:
            log.error(f"执行的方法为：delete，功能描述为：执行删除的sql语句，传入的参数为：{sql_sentence}, 错误类型为：ValueError, 错误的描述为：sql语句错误")
            raise ValueError("sql语句错误")

    def select(self, sql_sentence):
        """执行查询的sql语句"""
        log.info(f"执行的方法为：select，功能描述为：执行查询的sql语句，传入的参数为：{sql_sentence}")
        if isinstance(sql_sentence, str) and sql_sentence.strip().lower().startswith("select"):
            try:
                self.cursor.execute(sql_sentence)
            except Exception as e:
                log.error(
                    f"执行的方法为：select，功能描述为：执行查询的sql语句，传入的参数为：{sql_sentence}, 错误类型为：{type(e)}, 错误的描述为：{e}")
                raise e
            else:
                # 接收查询的结果
                select_result = self.cursor.fetchall()
                # 判断查询结果是否为空的元组，如果为空的元组返回None，如果不为空的元组返回查询的第一个结果
                if select_result:
                    return select_result[0][0]
        else:
            log.error(f"执行的方法为：select，功能描述为：执行查询的sql语句，传入的参数为：{sql_sentence}, 错误类型为：ValueError, 错误的描述为：sql语句错误")
            raise ValueError("sql语句错误")