sql >> Database teknologi >  >> RDS >> Mysql

Korrekt styring af databaseressourcer:markør og forbindelse

Dette lyder som et godt eksempel på en python context manager . Kontekstadministratorer giver dig mulighed for at administrere ressourcer korrekt , såsom en databaseforbindelse, ved at tillade dig at specificere, hvordan din ressources opsætnings- og nedtagningsmetoder skal fungere . Du kan oprette din egen brugerdefinerede konteksthåndtering på en af ​​to måder:For det første ved at pakke din databaseklasse og implementere de nødvendige metoder til konteksthåndteringen:__init__() , __enter__() , og __exit__() . For det andet ved at bruge en @contextmanager dekorator på en funktionsdefinition og oprette en generator for din databaseressource inden for nævnte funktionsdefinition. Jeg vil vise begge tilgange og lade dig beslutte, hvilken der er din præference. __init__() metoden er initialiseringsmetoden til din brugerdefinerede konteksthåndtering, svarende til den initialiseringsmetode, der bruges til brugerdefinerede pythonklasser. __enter__() metode er din opsætningskode til din tilpassede kontekstadministrator. Til sidst, __exit()__ metode er din nedrivning kode til din brugerdefinerede kontekstadministrator. Begge tilgange bruger disse metoder hvor den største forskel er, at den første metode udtrykkeligt angiver disse metoder i din klassedefinition. Hvor som i den anden tilgang, al koden op til din generators yield statement er din initialiserings- og opsætningskode og al koden efter yield statement er din deardown-kode. Jeg vil også overveje at udtrække dine brugerbaserede databasehandlinger i en brugermodelklasse. Noget i retning af:

tilpasset kontekstadministrator:(klassebaseret tilgang ):

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 (omdannet) :'

# 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))

kontekstleder (dekoratortilgang) :

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()

Derefter i din User klasse kan du bruge konteksthåndteringen ved først at importere filen og derefter bruge den på samme måde som før:

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

Forhåbentlig hjælper det!




  1. Tips til migrering fra proprietære til Open Source-databaser

  2. Kan jeg udføre flere forespørgsler adskilt af semikolon med MySQL Connector/J?

  3. Stop og vend tilbage, hvis en af ​​flere forberedte sætninger mislykkes

  4. Gem CSV-filer i mysql-databasen