Mysql
 sql >> база данни >  >> RDS >> Mysql

Правилно управление на ресурсите на базата данни:курсор и връзка

Това звучи като чудесен случай на използване на контекст мениджър на python . Контекстните мениджъри ви позволяват да правилно управлявате ресурси , като връзка с база данни, като ви позволява да укажете как трябва да работят методите за настройка и разрушаване на вашия ресурс . Можете да създадете свой собствен персонализиран контекстен мениджър по един от двата начина:Първо, като обвиете класа на вашата база данни и внедрите необходимите методи за контекстния мениджър:__init__() , __enter__() и __exit__() . Второ, като използвате @contextmanager декоратор на дефиниция на функция и създаване на генератор за ресурса на вашата база данни в рамките на дефиницията на тази функция. Ще покажа и двата подхода и ще ви оставя да решите кой от тях предпочитате. __init__() метод е метод за инициализация за вашия персонализиран контекстен мениджър, подобно на метода за инициализация, използван за персонализирани класове на python. __enter__() метод е вашият код за настройка за вашия персонализиран контекстен мениджър. И накрая, __exit()__ метод е вашето разрушаване код за вашия персонализиран контекстен мениджър. И двата подхода използват тези методи с основната разлика, че първият метод изрично ще посочи тези методи в дефиницията на вашия клас. Където, както при втория подход, целият код до yield на вашия генератор изявлението е вашият код за инициализация и настройка и целия код след yield изявлението е вашият код за сваляне. Също така бих помислил за извличане на вашите базирани на потребители действия на база данни в клас на потребителски модел. Нещо от типа на:

персонализиран контекстен мениджър:(подход, базиран на клас ):

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 (рефакториран) :'

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

контекстен мениджър (подход на декоратор) :

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

След това във вашия User клас можете да използвате диспечера на контекста, като първо импортирате файла и след това го използвате подобно на предишния:

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

Дано това помогне!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql се свързва в две таблици

  2. Sphinx Search / MySQL намират най-често срещаните думи

  3. MySQL агрегатни функции без клауза GROUP BY

  4. MySQL Вмъкване и присъединяване

  5. Как да получите броя дни на разлика между две дати в MySQL?