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

时间:2016-09-12 16:40:57

标签: python mysql database mysql-connector-python

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

  1. 使数据库对象成为全局(错误)
  2. 将数据库对象传递给每个其他对象的构造函数(inelegant)
  3. 完全停止使用数据库包装器类(烦人)
  4. 在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, ) )
    

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

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

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为没有人回应,这可能对将来的其他人有用。我建议使用“中途”全局,编写一个看起来像这样的中间模块:

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。它可能看起来有点复杂,但它允许您将类实现与实例化它们所需的参数分开,在本例中是数据库类及其相关凭证。