Това звучи като чудесен случай на използване на контекст мениджър
на 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)
Дано това помогне!