Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Właściwe zarządzanie zasobami bazy danych:kursorem i połączeniem

To brzmi jak świetny przypadek użycia pytona menedżera kontekstu . Menedżerowie kontekstu umożliwiają właściwe zarządzanie zasobami , takich jak połączenie z bazą danych, pozwalając określić sposób działania metod konfiguracji i wyłączania zasobu . Możesz utworzyć własnego niestandardowego menedżera kontekstu na jeden z dwóch sposobów:Po pierwsze, opakowując klasę bazy danych i implementując wymagane metody dla menedżera kontekstu:__init__() , __enter__() i __exit__() . Po drugie, wykorzystując @contextmanager dekorator na definicji funkcji i tworzenie generatora dla zasobu bazy danych w ramach wspomnianej definicji funkcji. Pokażę obydwa podejścia i pozwolę Ci zdecydować, które z nich najbardziej Ci odpowiada. __init__() metoda to metoda inicjowania dla niestandardowego menedżera kontekstu, podobnie jak metoda inicjowania używana dla niestandardowych klas Pythona. __enter__() metoda to Twój kod konfiguracji dla Twojego niestandardowego menedżera kontekstu. Wreszcie, __exit()__ metoda to Twoje rozkładanie kod dla niestandardowego menedżera kontekstu. Oba podejścia wykorzystują te metody przy czym główną różnicą jest to, że pierwsza metoda wyraźnie określi te metody w definicji klasy. Gdzie, tak jak w drugim podejściu, cały kod aż do yield twojego generatora oświadczenie to Twój kod inicjujący i konfiguracyjny i cały kod po yield oświadczenie to Twój kod zerwania. Rozważałbym również wyodrębnienie działań bazy danych opartych na użytkownikach do klasy modelu użytkownika. Coś w stylu:

menedżer kontekstu niestandardowego:(podejście oparte na klasach ):

import pymysql

class MyDatabase():
    def __init__(self):
        self.host = '127.0.0.1'
        self.user = 'root'
        self.password = ''
        self.db = 'API'

        self.con = None
        self.cur = None

    def __enter__(self):
        # connect to database
        self.con = pymysql.connect(host=self.host, user=self.user, password=self.password, db=self.db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
        self.cur = self.con.cursor()
        return self.cur

    def __exit__(self, exc_type, exc_val, traceback):
        # params after self are for dealing with exceptions
        self.con.close()

user.py (zrefaktoryzowany) :'

# import your custom context manager created from the step above
# if you called your custom context manager file my_database.py: from my_database import MyDatabase

import <custom_context_manager>

class User:
    def getUser(self, id):
        sql = 'SELECT * from users where id = %d'
        with MyDatabase() as db: 
            db.execute(sql, (id))
            result = db.fetchall()

        return result

    def getAllUsers(self):
        sql = 'SELECT * from users'
        with MyDatabase() as db: 
            db.execute(sql)
            result = db.fetchall()
        return result

    def AddUser(self, firstName, lastName, email):
        sql = "INSERT INTO `users` (`firstName`, `lastName`, `email`) VALUES (%s, %s, %s)"
        with MyDatabase() as db:
            db.execute(sql, (firstName, lastName, email))

menedżer kontekstu (podejście dekoratora) :

from contextlib import contextmanager
import pymysql


@contextmanager
def my_database():
    try:
        host = '127.0.0.1'
        user = 'root'
        password = ''
        db = 'API'
        con = pymysql.connect(host=host, user=user, password=password, db=db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
        cur = con.cursor()
        yield cur
    finally:
        con.close()

Następnie w swoim User klasy możesz użyć menedżera kontekstu, najpierw importując plik, a następnie używając go podobnie jak poprzednio:

with my_database() as db:
   sql = <whatever sql stmt you wish to execute>
   #db action 
   db.execute(sql)

Mam nadzieję, że to pomoże!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupa Laravel Eloquent według najnowszego rekordu

  2. Problemy z bazą danych podczas zezwalania na stałe logowanie do wielu przeglądarek

  3. Otrzymuj posty ze wszystkich kategorii z wyjątkiem jednej kategorii

  4. mysql zapomina, kto jest zalogowany:odmowa polecenia użytkownikowi ''@'%'

  5. Zaawansowane łączenie MySQL. Przyspieszenie zapytania