Điều này có vẻ giống như một trường hợp sử dụng tuyệt vời cho một trình quản lý ngữ cảnh
python
. Trình quản lý ngữ cảnh cho phép bạn quản lý tài nguyên đúng cách , chẳng hạn như kết nối cơ sở dữ liệu, bằng cách cho phép bạn chỉ định cách thức hoạt động của các phương pháp thiết lập và chia nhỏ tài nguyên của bạn . Bạn có thể tạo trình quản lý ngữ cảnh tùy chỉnh của riêng mình theo một trong hai cách:Thứ nhất, bằng cách gói lớp cơ sở dữ liệu của bạn và triển khai các phương thức cần thiết cho trình quản lý ngữ cảnh:__init__()
, __enter__()
và __exit__()
. Thứ hai, bằng cách sử dụng @contextmanager
trang trí trên một định nghĩa hàm và tạo một trình tạo cho tài nguyên cơ sở dữ liệu của bạn trong định nghĩa hàm đã nói. Tôi sẽ chỉ ra cả hai cách tiếp cận và để bạn quyết định cách nào là sở thích của bạn. __init__()
phương thức là phương thức khởi tạo cho trình quản lý ngữ cảnh tùy chỉnh của bạn, tương tự như phương thức khởi tạo được sử dụng cho các lớp python tùy chỉnh. __enter__()
phương pháp là mã thiết lập của bạn cho trình quản lý ngữ cảnh tùy chỉnh của bạn. Cuối cùng, __exit()__
phương pháp là giọt nước mắt của bạn mã cho trình quản lý ngữ cảnh tùy chỉnh của bạn. Cả hai cách tiếp cận đều sử dụng các phương pháp này với sự khác biệt chính là phương thức đầu tiên sẽ trình bày rõ ràng các phương thức này trong định nghĩa lớp của bạn. Trong trường hợp như trong cách tiếp cận thứ hai, tất cả mã cho đến yield
của trình tạo của bạn câu lệnh là mã khởi tạo và thiết lập của bạn và tất cả mã sau yield
tuyên bố là mã giọt nước mắt của bạn. Tôi cũng sẽ xem xét việc trích xuất các hành động cơ sở dữ liệu dựa trên người dùng của bạn vào một lớp mô hình người dùng. Vài nét về:
trình quản lý ngữ cảnh tùy chỉnh:( cách tiếp cận dựa trên lớp ):
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 (tái cấu trúc) :'
# 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))
trình quản lý ngữ cảnh (phương pháp trang trí) :
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()
Sau đó, trong User
của bạn bạn có thể sử dụng trình quản lý ngữ cảnh bằng cách nhập tệp trước và sau đó sử dụng nó tương tự như trước đây:
with my_database() as db:
sql = <whatever sql stmt you wish to execute>
#db action
db.execute(sql)
Hy vọng rằng điều đó sẽ hữu ích!