用pymysql简单操作数据库

用pymysql简单操作数据库

程序说明
待续

import time
import pymysql
import gevent
from gevent import monkey
from datetime import datetime as dt
from dbutils.pooled_db import PooledDB

monkey.patch_all()

db_conn= {
    "host": "*",
    "port": 0,
    "hostin": "*",
    "portin": *,
    "user": '*',
    "pwd": '*'
}

class DB(object):
    ''' dbconnection'''

    def __init__(self, dbconn, database=None, netout=True):
        '''数据库基本链接信息,数据库,是否为外网'''
        self.__database = database
        self.__pool = self._get_pool(dbconn, database, netout)
        # self.s=dbconn.get("port")

    def _get_pool(self, dbconn, database, tag=True):
        try:
            if tag:
                pool = PooledDB(
                    creator=pymysql,
                    maxconnections=15,
                    host=dbconn.get("host"),
                    user=dbconn.get("user"),
                    passwd=dbconn.get("pwd"),
                    db=database,
                    port=dbconn.get("port"),
                )
            else:
                pool = PooledDB(
                    creator=pymysql,
                    host=dbconn.get("hostin"),
                    user=dbconn.get("user"),
                    passwd=dbconn.get("pwd"),
                    db=database,
                    port=dbconn.get("portin"),
                )
        except Exception as e:
            pool = None
            print(dt.now(), "log==>", e)

        return pool

    def _get_connection_and_cursor(self):
        '''获取游标链接 conn, cursor'''
        conn = self.__pool.connection()
        cursor = conn.cursor()
        # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        return conn, cursor

    def _close_all(self, *args):
        '''关闭链接'''
        try:
            for i in args:
                i.close()
        except:
            print("参数错误是否为conn, cursor")

    def get_tables(self) -> list:
        '''获取数据库的表 返回为列表'''
        conn, cursor = self._get_connection_and_cursor()
        sql = f'show tables from {self.__database}'
        tables = []
        try:
            rows = cursor.execute(sql)  # 返回执行成功的结果条数
            print(f'{self.__database} 一共有 {rows} 张表')
            for d in cursor.fetchall():
                for k, v in d.items():
                    tables.append(v)
        except Exception as e:
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)

        return tables

    def get_table_file(self, table: str) -> list:
        '''获取表的字段名'''
        conn, cursor = self._get_connection_and_cursor()
        # sql = f'desc {table}'
        sql = f"SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT  FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{table}'"
        try:
            cursor.execute(sql)
            res = cursor.fetchall()
            # print(res)
            files = [(x['COLUMN_NAME'], x['COLUMN_COMMENT']) for x in res]
        except Exception as e:
            files = None
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)
        return files

    def get_index_file(self, table: str) -> list:
        '''取得索引'''
        conn, cursor = self._get_connection_and_cursor()
        sql = f"SHOW INDEX FROM {table}"
        try:
            cursor.execute(sql)
            res = cursor.fetchall()
            # pprint(res)
            files = [x['Column_name'] for x in res]
        except Exception as e:
            files = None
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)
        return files

    def query_by_sql(self, sql):
        '''查询语句'''
        print(dt.now(), sql)
        conn, cursor = self._get_connection_and_cursor()
        try:
            cursor.execute(sql)
            res = cursor.fetchall()
        except Exception as e:
            res = None
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)
        return res

    def exec_by_sql(self, sql):
        '''执行语句添加,更新,删除(单)'''
        conn, cursor = self._get_connection_and_cursor()
        print(dt.now(), sql)
        try:
            cursor.execute(sql)
            conn.commit()
        except Exception as e:
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
            conn.rollback()
        self._close_all(conn, cursor)
        
    def exec_by_sql(self, sql, data_list):
    	'''执行语句添加,更新,删除(多)'''
    	pass

    def get_count_by_index(self, table):
        '''统计表数量通过索引'''
        file = self.get_index_file(table)
        fiirst_index = file[0]
        sql = f"select count({fiirst_index}) from {table}"
        conn, cursor = self._get_connection_and_cursor()
        try:
            key = f"count({fiirst_index})"
            cursor.execute(sql)
            rse_count = [table, cursor.fetchall()[0][str(key)]]
        except Exception as e:
            rse_count = None
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)
        # print(rse_count)
        return rse_count

    def get_count(self, table):
        '''统计表数量'''
        # print(table)
        file = self.get_index_file(table)
        sql = f"select count(*) from {table}"
        conn, cursor = self._get_connection_and_cursor()
        try:
            cursor.execute(sql)
            rse_count = [table, cursor.fetchall()[0]]
        except Exception as e:
            rse_count = None
            print('\033[1;31m', dt.now(), 'errorlog==》', sql, e, '\033[0m')
        self._close_all(conn, cursor)
        # print(rse_count)
        return rse_count


class CoroutinesGevent(DB):
    ''' 协程操作'''
    def process_item(self, table_list: list):
        '''协程 统计库所有表数据'''
        geventlist = [gevent.spawn(self.get_count, x) for x in table_list]
        gevent.joinall(geventlist)
        return [x.value for x in geventlist]


class FindAllDatabase:

    def __init__(self, database):
        self.db = pymysql.Connection(host=database["host"], 
                                     user=database["user"], 
                                     passwd=database["pwd"],
                                     port=database["port"])
        self.cursor = self.db.cursor()

    def get_databases(self):
        '''获取所有的数据库名字'''
        try:
            self.cursor.execute("show databases")
            res = self.cursor.fetchall()
            databases = [r[0] for r in res]
        except Exception as e:
            databases = []
            print('\033[1;31m', dt.now(), 'errorlog==》', e, '\033[0m')
        self.cursor.close()
        self.db.close()
        return databases
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值