これは、Python コンテキストマネージャー
の優れたユースケースのように思えます。 。コンテキストマネージャーを使用すると、リソースを適切に管理できます。 、データベース接続など、リソースのセットアップメソッドとティアダウンメソッドがどのように機能するかを指定できるようにする 。独自のカスタムコンテキストマネージャーは、次の2つの方法のいずれかで作成できます。まず、データベースクラスをラップし、コンテキストマネージャーに必要なメソッドを実装します。__init__()
、__enter__()
、および__exit__()
。次に、@contextmanager
を利用します 関数定義のデコレータと、その関数定義内のデータベースリソースのジェネレータを作成します。私は両方のアプローチを示し、どちらがあなたの好みであるかをあなたに決めさせます。 __init__()
メソッドは初期化メソッドです カスタムPythonクラスに使用される初期化メソッドと同様に、カスタムコンテキストマネージャーの場合。 __enter__()
メソッドはセットアップコードです カスタムコンテキストマネージャー用。最後に、__exit()__
メソッドは分解です カスタムコンテキストマネージャーのコード。 どちらのアプローチもこれらの方法を利用します 主な違いは、最初のメソッドがクラス定義内でこれらのメソッドを明示的に示すことです。 2番目のアプローチと同様に、ジェネレーターの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)
うまくいけば、それがお役に立てば幸いです!