Правильное использование DBUtils PooledDB в модулях? - PullRequest
0 голосов
/ 03 мая 2020

Я использую пакет DBUtils с их классом PooledDB для управления соединениями с моей базой данных в отдельном модуле.

Код itselfe работает, как и ожидалось, но я совершенно не уверен, является ли мой тип использования правильным или оптимальным.

Итак, мои вопросы: 1. Поскольку PooledDB открывает несколько соединений в один раз, хорошо ли это вызывать в самом init или я должен вызывать его непосредственно перед выбором и так далее? 2. Есть ли хорошие уроки о том, как использовать PooledDB? Я не нашел ни одного хорошего!

Мой код выглядит так (сокращенно):

Модуль пула БД:

import pyodbc
from DBUtils.PooledDB import PooledDB

class Database:
    def __init__(self):
        self.server = "..."
        self.driver = '{ODBC Driver 13 for SQL Server}'
        self.port = 1433
        self.database = '...'
        self.username = '...'
        self.password = '...!'
        self._CreatePool()

    def _CreatePool(self):
        self.Pool = PooledDB(creator=pyodbc, mincached=2, maxcached=5, maxshared=3, 
                             maxconnections=6, blocking=True, DRIVER=self.driver, 
                             SERVER=self.server, PORT=self.port, DATABASE=self.database, 
                             UID=self.username, PWD=self.password)

    def _Getconnect(self):
        self.conn = self.Pool.connection()
        cur = self.conn.cursor()
        if not cur:
            raise "connection error"
        else:
            return cur

    def ExecQuery(self, sql, addition=""):        
        cur = self._Getconnect()

        if addition != "":
            cur.execute(sql, addition)
        else:
            cur.execute(sql)

        relist = cur.fetchall()        
        cur.close()
        self.conn.close()

        return relist

А в других моих модулях, в основном GUI с wx Python, я называю это так:

class PanelTest(scrolled.ScrolledPanel):
    def __init__(self, parent):
        self.ms = ERP_DB_Pool.Database()
...