0

MySQL データベースの周りに単純な Python ラッパーがあり、Python 内の他のカスタム クラス オブジェクト内からアクセスできるようにする必要があります。ラッパー クラスは、他の各カスタム クラスとは別のファイルにあります。これまでのところ、次の方法しか見つけることができませんでした。

  1. データベース オブジェクトをグローバルにする (悪い)
  2. データベース オブジェクトを他のすべてのオブジェクトのコンストラクターに渡す (洗練されていない)
  3. データベース ラッパー クラスの使用を完全に停止する (迷惑)

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 でこの種の状況を処理する最善の方法について、理解を深めたいと思います。前もって感謝します!

4

1 に答える 1