python - mysql реализация пула соединений - PullRequest
0 голосов
/ 11 июля 2020

Это класс пула соединений mysql, который я получил из учебника

    import time
import mysql.connector.pooling
from Constants import dbconfig
from LoggerClass import appLog

class MySQLPool(object):
    """
    create a pool when connect mysql, which will decrease the time spent in 
    request connection, create connection and close connection.
    """
    def __init__(self, host="172.0.0.1", port="3306", user="root",
                 password="123456", database="test", pool_name="mypool",
                 pool_size=3):
        res = {}
    self._host = host
    self._port = port
    self._user = user
    self._password = password
    self._database = database

    res["host"] = self._host
    res["port"] = self._port
    res["user"] = self._user
    res["password"] = self._password
    res["database"] = self._database
    self.dbconfig = res
    self.pool = self.create_pool(pool_name=pool_name, pool_size=pool_size)

def create_pool(self, pool_name="mypool", pool_size=3):
    """
    Create a connection pool, after created, the request of connecting 
    MySQL could get a connection from this pool instead of request to 
    create a connection.
    :param pool_name: the name of pool, default is "mypool"
    :param pool_size: the size of pool, default is 3
    :return: connection pool
    """
    try:
        pool = mysql.connector.pooling.MySQLConnectionPool(
            pool_name=pool_name,
            pool_size=pool_size,
            pool_reset_session=True,
            **self.dbconfig)
        appLog('info','system','MysqlConnectorClass.py','create_pool','mysql connection established')
        return pool
    except Exception as exce:
        appLog('error','system','MysqlConnectorClass.py','create_pool','error in creating mysql connection'+str(exce))
        return None

def close(self, conn, cursor):
    """
    A method used to close connection of mysql.
    :param conn: 
    :param cursor: 
    :return: 
    """
    try:
        cursor.close()
        conn.close()
        appLog('info','system','MysqlConnectorClass.py','close connection','mysql pool connection closed')
    except Exception as exce:
        appLog('info','system','MysqlConnectorClass.py','Error in close connection','mysql pool connection was not closed '+str(exce))


def execute(self, sql, args, buff, fetchMode):
    """
    Execute a sql, it could be with args and with out args. The usage is 
    similar with execute() function in module pymysql.
    :param sql: sql clause
    :param args: args need by sql clause
    :param commit: whether to commit
    :return: if commit, return None, else, return result
    """
    # get connection form connection pool instead of create one.
    if self.pool!=None:
        conn = self.pool.get_connection()
        if conn!=None:
            if buff:
                cursor = conn.cursor(buffered=True)
            else:
                cursor = conn.cursor()
            if args:
                cursor.execute(sql, args)
            else:
                cursor.execute(sql)
        
            if fetchMode == 'all':
                res = cursor.fetchall()
            elif fetchMode == 'one':
                res = cursor.fetchone()

            return {"res":res,"cur":cursor, "conn":conn}
        else:
            return None
    else:
        return None

def executemany(self, sql, args, buff, fetchMode):
    """
    Execute with many args. Similar with executemany() function in pymysql.
    args should be a sequence.
    :param sql: sql clause
    :param args: args
    :param commit: commit or not.
    :return: if commit, return None, else, return result
    """
    # get connection form connection pool instead of create one.
    if self.pool!=None:
        conn = self.pool.get_connection()
        if conn!=None:
            conn = self.pool.get_connection()
            if buff:
                cursor = conn.cursor(buffered=True)
            else:
                cursor = conn.cursor()
            if args:
                cursor.executemany(sql, args)
            else:
                cursor.executemany(sql)
        
            if fetchMode == 'all':
                res = cursor.fetchall()
            elif fetchMode == 'one':
                res = cursor.fetchone()

            return {"res":res,"cur":cursor, "conn":conn}
        else:
            return None
    else:
        return None

, и мне нужно вызвать этот класс из другого python файла, например, pyPoolTest.py

import time
from Constants import dbconfig
from MysqlConnectorClass import MySQLPool


if __name__ == "__main__":
    
    sql = "select * from GTG_PROJECTS"
    mysql_pool = MySQLPool(**dbconfig)
    if mysql_pool!=None:
        sqlData = mysql_pool.execute(sql,None,False,'all')
        print(sqlData['res'])
        mysql_pool.close(sqlData['conn'],sqlData['cur'])
    else:
        print('Error in accesing db')

Мне было интересно, в каждом python файле мне нужно сначала инициализировать первый python класс, чтобы получить объект пула и получить доступ к БД, поэтому, как я понимаю, создается новое соединение пула. Поэтому я не могу использовать уже созданный объект пула соединений и повторно использовать соединение.

Что я упускаю или делаю неправильно?

Я хочу получить доступ к базе данных из каждого файла python, поэтому я необходимо инициализировать класс из этих файлов.

Пожалуйста, поделитесь со мной правильным способом использования класса или концепции пула соединений mysql, чтобы я мог получить доступ к пулу из всех моих файлов python.

Надеюсь, мой вопрос ясен

Я много искал, как получить доступ к классу python - mysql из другого файла, и не смог найти подходящий ответ

Пожалуйста, помогите

1 Ответ

1 голос
/ 13 июля 2020

Вместо того, чтобы импортировать каждый вариант использования и использовать MySQLPool напрямую, вы должны создать объект, который инициализирует и хранит один общий экземпляр MySQLPool, и пусть ваши варианты использования приложения будут взаимодействовать с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...