0

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

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

在 Python 中肯定有更好的方法来做到这一点(是的,我已经搜索了网络和 Stack Overflow,但显然我正在搜索错误的关键字)。谁能解释它是什么?我只需要一个数据库连接,而我的其他大多数类都需要使用它。解释我正在尝试做的事情的虚拟 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, ) )

另一个需要访问数据库的类(NBdb类方法中未声明的对象):

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

访问数据库的第三个类(NBdb类方法中未声明的对象):

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

1

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

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

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

from my_db_instantiation import db

然后,您可以db在每个需要它的类中访问相同的数据库对象。请注意,仅直接my_db_intermediary导入my_db_class。所有其他模块导入my_db_intermediary. 它可能看起来有点复杂,但它允许您将类实现与实例化它们所需的参数分开,在这种情况下是数据库类及其关联的凭据。

于 2016-09-19T11:15:00.660 回答