Python - 从多个对象访问单个数据库包装器对象

Python - accessing single database wrapper object from multiple objects

我有一个围绕 MySQL 数据库的简单 Python 包装器,我需要能够从 Python 中的其他自定义 class 对象访问它。包装器 class 存在于每个其他自定义 class 的单独文件中。到目前为止,我只能找到以下处理方法:

  1. 使数据库对象成为全局对象(不好)
  2. 将数据库对象传递给每个其他对象的构造函数(不优雅)
  3. 完全停止使用数据库包装器class(烦人)

在 Python 中肯定有更好的方法来执行此操作(是的,我搜索了网络和 Stack Overflow,但显然我正在搜索错误的关键字)。任何人都可以解释它是什么吗?我只需要一个数据库连接,而我的大多数其他 classes 都需要使用它。虚拟 Python 代码解释了我正在尝试做的事情。

(部分)数据库包装器 class:

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, ) )

另一个 class 需要访问数据库(N.B。class 方法中未声明的对象 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()

访问数据库的第三个 class(N.B。class 方法中未声明的对象 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 中这种情况的理解。提前致谢!

回答我自己的问题,因为没有人回答,这可能对以后的其他人有用。我被推荐使用 "half-way" 全局,通过编写一个看起来像这样的中间模块:

from my_db_class import Database
db = Database( 'user', 'password', 'database' )

然后在 QueueUser class 中,做这样的事情:

from my_db_instantiation import db

然后您可以在每个需要它的 class 中访问同一个 db 数据库对象。请注意,只有 my_db_intermediary 直接导入 my_db_class。所有其他模块都导入 my_db_intermediary。它可能看起来有点令人费解,但它允许您将 class 实现与实例化它们所需的参数分开,在本例中是数据库 class 及其相关凭据。