【Web_接口測試_Python3_Mysql_數據庫基礎操作】(數據庫)自動重連、獲取庫名、獲取表名、批量生成sql語句,自動化實戰案例

#!/usr/bin/env/python3
# -*- coding:utf-8 -*-
'''
Author:leo
Date&Time:2020/02/15 and 12:30
Project:Python3
FileName:demo_mysql.py
Description:
1.數據庫增刪查改
2.數據庫獲取庫名
3.數據庫獲取表名
4.數據庫批量生成sql語句
5.數據庫批量讀取sql文件
'''
import pymysql,MySQLdb,sys,time,re,pymysql,os
sys.path.append(r'...')
from hb_config import Deve_envirment as de
import MySQLdb.cursors
delete_nowTime = time.strftime('%Y-%m-%d %H%M%S', time.localtime(time.time())).split(" ")[0]  # 公共參數
mysql_time = time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time()))
class hb_mysql():

    def create_mysql_conn(self, database_name='mysql'):
        print("\n----開始連接數據庫----\n")
        conn_status, conn_retries_count, max_retries_count = True, 0, 5
        while conn_status == True and conn_retries_count < max_retries_count:
            try:
                conn = pymysql.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8', connect_timeout=10)
                conn_status = False
                print(f"\n----成功連接數據庫:類型-{type(conn)} 名稱-{conn}\n")
                return conn
            except Exception as e:
                conn_retries_count += 1
                print("\n----數據庫連接失敗,10s後自動重連,第{}次重連開始:{}".format(conn_retries_count, e))
                time.sleep(10)
                continue

    def get_database_name(self, database_name='mysql'):
        print("\n----獲取數據庫:庫名稱----\n")
        conn = pymysql.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8')
        cursor = conn.cursor()
        cursor.execute('show databases;')
        DISABLED_DATABASES = ['information_schema', 'mysql']
        db0 = str(re.sub(r'[()\' ]', '', str(cursor.fetchall()))).split(",")
        dbs_list = [i for i in db0 if i != '' and i not in DISABLED_DATABASES]
        print(f"{database_name}-數據庫統計:{len(dbs_list)},{len(DISABLED_DATABASES)}\n業務庫:{dbs_list}\n原始庫:{DISABLED_DATABASES}")
        cursor.close()
        conn.close()
        return dbs_list

    def get_tables_name(self, database_name='mysql'):
        print("\n----獲取數據庫:表名稱----\n")
        conn = pymysql.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8')
        cursor = conn.cursor()
        cursor.execute('show tables;')
        db0 = str(re.sub(r'[()\' ]', '', str(cursor.fetchall()))).split(",")
        tbs_list = [i for i in db0 if i != '']
        print(f"{database_name}-數據表統計:{len(tbs_list)}\n{tbs_list}")
        cursor.close()
        conn.close()
        return tbs_list

    def get_col_name(self, database_name='mysql', sql=""):
        print("\n----獲取數據庫:列名稱----\n")
        conn = pymysql.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8')
        cursor = conn.cursor()
        cursor.execute(sql)
        col = cursor.description
        col_list = []
        for field in col:
            col_list.append(field[0])
        print(col_list)
        conn.close()
        return col_list

    def select_info(self, database_name, select_sql):
        db = MySQLdb.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8')
        cursor = db.cursor()
        try:
            print("\n----查詢數據----\n")
            print("sql:", select_sql)
            cursor.execute(select_sql)
        except Exception as e:
            print(f"Exception:{e}")
        data_all = cursor.fetchall()
        print(f"全部數據:{type(data_all)} {data_all}")
        cursor.close()
        db.close()
        for data in data_all[:]:
            str_data = str(data).replace('"', " ").replace("'", ' ').replace(" ", "")
        return str_data

    def delete_info(self, database_name, table, delete_sql, delete_time=delete_nowTime):
        db = MySQLdb.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='utf8')
        cursor = db.cursor()
        try:
            print("\n----刪除數據----\n")
            cursor.execute(f"select * from {table} where create_time LIKE'{delete_time} %';")  # 改日期!!!!
            data_all = cursor.fetchall()
            for data in data_all[:]:
                print(f"獲取全部數據:\n{type(data)} {data}")
            cursor.execute(delete_sql)
            db.commit()
        except Exception as e:
            print(f"Exception:{e}")
            db.rollback()
        cursor.close()
        db.close()
        return data_all

    def execute_mysql(self, database_name, execute_sql):
        db = MySQLdb.connect(de.database['host'], de.database['username'], de.database['password'], database_name, charset='gbk', connect_timeout=10)
        cursor = db.cursor()
        execute_sql = execute_sql.lower()
        try:
            if "insert" in execute_sql.lower():
                print("\n----開始執行insert語句----\n")
                cursor.execute(execute_sql)
                db.commit()
                print("insert-執行成功")
                print("\n--查詢數據\n")
                select_tablename = str(execute_sql.split(" ")[2]).split("(")[0].rstrip(";")
                insert_key, insert_value = str(execute_sql.split("(")[1]).split(",")[0], str(execute_sql.split("(")[2]).split(",")[0]
                where_sql = f" where {insert_key}={insert_value}"
                select_excute_sql = f"select * from {select_tablename}{where_sql};"
                print(f"原始sql:{execute_sql}\n查詢sql:{select_excute_sql}")
                cursor.execute(select_excute_sql)
                # 獲取全部數據
                select_all_data, select_all_data_list = cursor.fetchall(), []
                print(f"\n查詢全部數據(類型、統計、詳情):{select_tablename} {len(select_all_data)} {type(select_all_data)} {select_all_data}")
                for one_data in select_all_data[:]:
                    str_data = str(one_data).replace('"', " ").replace("'", ' ').replace(" ", "")
                    select_all_data_list.append(str_data)
                    print(str_data)
                return select_all_data_list
            elif "delete" in execute_sql.lower():
                print("\n----開始執行delete語句----\n")
                select_tablename = execute_sql.split(" ")[2].rstrip(";")
                if 'where' in execute_sql.lower():
                    where_sql = " where" + execute_sql.split("where")[1].rstrip(";")
                else:
                    where_sql = ""
                print("\n--查詢數據\n")
                select_excute_sql = f"select * from {select_tablename}{where_sql};"
                print(f"原始sql:{execute_sql}\n查詢sql:{select_excute_sql}")
                cursor.execute(select_excute_sql)
                # 獲取全部數據
                select_all_data, select_all_data_list = cursor.fetchall(), []
                print(f"\n查詢全部數據(類型、統計、詳情):{select_tablename} {len(select_all_data)} {type(select_all_data)} {select_all_data}")
                for one_data in select_all_data[:]:
                    str_data = str(one_data).replace('"', " ").replace("'", ' ').replace(" ", "")
                    select_all_data_list.append(str_data)
                    print(str_data)
                print("\n--執行SQL\n")
                print("delete-執行成功")
                cursor.execute(execute_sql)
                db.commit()
                return select_all_data_list
            elif "select" in execute_sql.lower():
                print("\n----開始執行select語句----\n")
                select_tablename = execute_sql.split(" ")[3].rstrip(";")
                if 'where' in execute_sql.lower():
                    where_sql = " where" + execute_sql.split("where")[1].rstrip(";")  # where id='123' where條件id='123'不能有空格
                else:
                    where_sql = ""
                    print("select-執行成功")
                print("\n--查詢數據\n")
                select_excute_sql = f"select * from {select_tablename}{where_sql};"
                print(f"原始sql:{execute_sql}\n查詢sql:{select_excute_sql}")
                cursor.execute(select_excute_sql)  # 改日期!!!!
                select_all_data, select_all_data_list = cursor.fetchall(), []
                print(f"\n查詢全部數據(類型、統計、詳情):{select_tablename} {len(select_all_data)} {type(select_all_data)} {select_all_data}")
                for one_data in select_all_data[:]:
                    str_data = str(one_data).replace('"', " ").replace("'", ' ').replace(" ", "")
                    select_all_data_list.append(str_data)
                    print(str_data)
                return select_all_data_list
            elif "update" in execute_sql.lower():
                print("\n----開始執行update語句----\n")
                cursor.execute(execute_sql)
                db.commit()
                print("update-執行成功")
                select_tablename = execute_sql.split(" ")[1].rstrip(";")
                if 'where' in execute_sql.lower():
                    where_sql = " where" + execute_sql.split("where")[1].rstrip(";")  # where id='123' where條件id='123'不能有空格
                else:
                    where_sql = ""
                print("\n--查詢數據\n")
                select_excute_sql = f"select * from {select_tablename}{where_sql};"
                print(f"原始sql:{execute_sql}\n查詢sql:{select_excute_sql}")
                cursor.execute(select_excute_sql)
                select_all_data, select_all_data_list = cursor.fetchall(), []
                print(f"\n查詢全部數據(類型、統計、詳情):{select_tablename} {len(select_all_data)} {type(select_all_data)} {select_all_data}")
                for one_data in select_all_data[:]:
                    str_data = str(one_data).replace('"', " ").replace("'", ' ').replace(" ", "")
                    select_all_data_list.append(str_data)
                    print(str_data)
                return select_all_data_list
        except (Exception, IndexError) as e:
            print(f"Exception info:{e}")
            print('Exception line:{}'.format(sys.exc_info()[-1].tb_lineno))
            db.rollback()
        finally:
            cursor.close()
            db.close()
        return

    def mkdir_if_not_exists(self, path=f"{mysql_time}"):
        """
        新建存放文件夾:判斷給定目錄是否存在,不存在則創建它
        Args:
            path: 帶創建目錄名稱(後續寫入路徑需要{BACKUP_PATH}+"\\"+{sonfile_name})
        """
        path = path.rstrip("\\")  
        if not os.path.exists(path):
            os.mkdir(path)

    def write_mysql(self, mfile_path = f"{mysql_time}"):
        hb_mysql().mkdir_if_not_exists(mfile_path)
        database_name = hb_mysql().get_database_name("mysql")
        for db_name in database_name:
            try:
                if db_name not in ['mysql']:
                    mysql_list = []
                    tables_name = hb_mysql().get_tables_name(db_name)
                    for t_name in tables_name[:]:
                        data = f"DELETE FROM {db_name}.{t_name} where create_time > @create_time;\n"
                        mysql_list.append(data)
                    with open(mfile_path + "\\" + f'{db_name}_{len(mysql_list)}.sql', mode="w+", encoding="utf8") as mfile:
                        mfile.writelines(mysql_list)
                    print(f"--成功生成sql條數:{db_name}  {len(mysql_list)}")
                else:
                    print(f"\n----非業務相關數據庫:{db_name}")
            except Exception as e:
                print(e)
        return None
    # apollo 數據庫密碼解密
    def mysql_password_Decrypt(self, new_password = "znf2AMF3zsQKYT4ucHBYQ2RPpLXvSPht"):
        import subprocess,os
        # os.system_34("cmd")
        # time.sleep(1)
        # os.system_34("exit")
        # input("exit")

        # 解密正文
        password_path = r"jasypt-1.9.2\bin"
        with open(password_path + r"\win_decrypt1.bat", "w+") as m:
            password_info = f"""@echo off\n@call decrypt.bat input="{new_password}" password="Oat4jkamo$dK"\npause;"""
            m.write(password_info)
            m.seek(0, 0)
            print("\n----文件地址----:" + f"D:\Mytest\Python3\Python3\...\...sit\mysql\jasypt-1.9.2\\bin")
            print("\n----修改成功----\n", m.read())  # 生成的文件右下角改成lf保存,纔可以執行成功
            a1 = os.system("d: && cd D:\Mytest\Python3\Python3\...\...sit\mysql\jasypt-1.9.2\\bin && win_decrypt1.bat")
            print("1.返回0成功;2.返回1失敗;3.返回2系統錯誤;\n--當前結果:", a1)
            print("after")
            print("---- 2.加start關鍵字,非阻塞式調用 ----")
            testFile = os.system("start for %i in (1, 2, 3) do @echo %i")
            print("1.返回0成功;2.返回1失敗;3.返回2系統錯誤;\n--當前結果:", testFile)

if __name__ == "__main__":
    pass

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章