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

标签 python mysql database mysql-connector-python

我有一个围绕 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, ) )

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

访问数据库的第三个类(注意,类方法中未声明的对象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 中最好地处理这种情况的理解。提前致谢!

最佳答案

回答我自己的问题,因为没有人回复,这可能对其他人有用。建议我通过编写一个如下所示的中间模块来使用“半途”全局:

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

关于Python - 从多个对象访问单个数据库包装对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454993/

相关文章:

python - RabbitMQ:如何在 Python 生产者和消费者之间发送 Python 字典?

MySQL右外连接查询

mysql - 在 MySQL(InnoDB)中删除和插入需要很长时间

C# 连接到 postgres 数据库

python - Odoo错误: TypeError: 'int' object is not iterable

python - 读取以列名作为行的 csv 文件并编辑日期时间

python - 如何在nginx代理后面的 Pyramid 服务器中获取客户端的真实IP

javascript - 插入后无法返回正确的响应

MySQL RDS存储过程更新查询速度慢

database - 使用 T-SQL 使用 .bak 文件创建新数据库