sql >> Databáze >  >> RDS >> Mysql

Správná správa databázových zdrojů:kurzor a připojení

To zní jako skvělý případ použití pro python kontextový správce . Správci kontextu vám umožňují správně spravovat zdroje , jako je připojení k databázi, tím, že vám umožní určit, jak by měly fungovat metody nastavení a odstranění zdroje . Svého vlastního správce kontextu můžete vytvořit jedním ze dvou způsobů:Za prvé, zabalením třídy databáze a implementací požadovaných metod pro správce kontextu:__init__() , __enter__() a __exit__() . Za druhé, pomocí @contextmanager dekorátor na definici funkce a vytvoření generátoru pro váš databázový prostředek v rámci uvedené definice funkce. Ukážu oba přístupy a nechám vás, abyste se rozhodli, který z nich preferujete. __init__() metoda je inicializační metoda pro váš vlastní kontextový manažer, podobný metodě inicializace používané pro vlastní třídy pythonu. __enter__() metoda je váš kód nastavení pro váš vlastní kontextový manažer. Nakonec __exit()__ metoda je vaše stržení kód pro váš vlastní kontextový manažer. Tyto metody využívají oba přístupy s hlavním rozdílem, že první metoda explicitně uvede tyto metody ve vaší definici třídy. Kde jako ve druhém přístupu je veškerý kód až do yield vašeho generátoru výpis je váš inicializační a nastavovací kód a veškerý kód za yield výpis je váš kód pro odstranění. Také bych zvážil extrahování vašich uživatelských databázových akcí do třídy uživatelského modelu. Něco ve smyslu:

vlastní kontextový manažer:(přístup založený na třídě ):

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 (refaktorováno) :'

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

kontextový manažer (přístup dekoratér) :

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

Poté v rámci vašeho User třídy můžete použít správce kontextu tak, že nejprve importujete soubor a poté jej použijete podobně jako dříve:

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

Snad to pomůže!




  1. Proč se můj float ukládá v MYSQL jako 0,9999, když je větší než 1?

  2. MySQL - Přejmenovat sloupec

  3. C program připojení mysql

  4. JDBC ResultSet getDate ztrácí přesnost