我有一个围绕 MySQL 数据库的简单 Python 包装器,并且我需要能够从 Python 中的其他自定义类对象内部访问它。包装类与其他每个自定义类位于单独的文件中。到目前为止,我只能找到以下方法:
- 将数据库对象设置为全局(不好)
- 将数据库对象传递到每个其他对象的构造函数中(不优雅)
- 完全停止使用数据库包装类(烦人)
在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' )
然后在 Queue
和 User
类中,执行如下操作:
from my_db_instantiation import db
然后,您可以在每个需要它的类中访问相同的 db
数据库对象。请注意,只有 my_db_intermediary
直接导入 my_db_class
。所有其他模块均导入 my_db_intermediary
。它可能看起来有点复杂,但它允许您将类实现与实例化它们所需的参数分开,在本例中是数据库类及其关联的凭据。
关于Python - 从多个对象访问单个数据库包装对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454993/