我有一个围绕 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, ) )
另一个需要访问数据库的类(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 中处理这种情况的理解。提前致谢!