MySQL データベースの周りに単純な Python ラッパーがあり、Python 内の他のカスタム クラス オブジェクト内からアクセスできるようにする必要があります。ラッパー クラスは、他の各カスタム クラスとは別のファイルにあります。これまでのところ、次の方法しか見つけることができませんでした。
- データベース オブジェクトをグローバルにする (悪い)
- データベース オブジェクトを他のすべてのオブジェクトのコンストラクターに渡す (洗練されていない)
- データベース ラッパー クラスの使用を完全に停止する (迷惑)
Python でこれを行うためのより良い方法がきっとあるはずです (はい、Web と Stack Overflow を検索しましたが、どうやら間違ったキーワードを検索しているようです)。誰がそれが何であるかを説明できますか? 必要なデータベース接続は 1 つだけで、他のほとんどのクラスはそれを使用する必要があります。私がやろうとしていることを説明するダミーのPythonコードは次のとおりです。
(部分的) データベース ラッパー クラス:
import mysql.connector
class Database:
def __init__( self, username, password, database, host = 'localhost' ):
self.connection = mysql.connector.connect( user = username, password = password, database = database, host = host )
self.connection.set_autocommit( True )
self.cursor = self.connection.cursor( dictionary = True )
def __del__( self ):
self.cursor.close()
self.connection.close()
def fetchAll( self, query, constraints = None ):
self.cursor.execute( query, constraints )
return self.cursor.fetchall()
def delete( self, id, table, key = 'id' ):
self.cursor.execute( 'DELETE FROM `' + table + '` WHERE `' + key + '` = %s', ( id, ) )
データベースへのアクセスを必要とする別のクラス (クラス メソッド内の宣言されていないオブジェクトdb
):
class Queue:
def __init__( self ):
self.jobs = []
def refreshJobs( self ):
self.jobs = db.fetchAll( 'SELECT * FROM `jobs`' )
def deleteJob( self, id ):
db.delete( id, 'jobs' )
self.refreshJobs()
データベースにアクセスする 3 番目のクラス (クラス メソッド内の宣言されていないオブジェクトdb
):
class User:
def __init__( self, email ):
self.email = email
details = db.fetchAll( 'SELECT * FROM `users` WHERE `email` = %s', [email] )
if( len( details ) == 1 ):
self.password = details[0]['password']
フレームワークの推奨事項を除いて、どんな提案も大歓迎です。Python でこの種の状況を処理する最善の方法について、理解を深めたいと思います。前もって感謝します!