Python - 从多个对象访问单个数据库包装器对象
Python - accessing single database wrapper object from multiple objects
我有一个围绕 MySQL 数据库的简单 Python 包装器,我需要能够从 Python 中的其他自定义 class 对象访问它。包装器 class 存在于每个其他自定义 class 的单独文件中。到目前为止,我只能找到以下处理方法:
- 使数据库对象成为全局对象(不好)
- 将数据库对象传递给每个其他对象的构造函数(不优雅)
- 完全停止使用数据库包装器class(烦人)
在 Python 中肯定有更好的方法来执行此操作(是的,我搜索了网络和 Stack Overflow,但显然我正在搜索错误的关键字)。任何人都可以解释它是什么吗?我只需要一个数据库连接,而我的大多数其他 classes 都需要使用它。虚拟 Python 代码解释了我正在尝试做的事情。
(部分)数据库包装器 class:
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, ) )
另一个 class 需要访问数据库(N.B。class 方法中未声明的对象 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()
访问数据库的第三个 class(N.B。class 方法中未声明的对象 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 中这种情况的理解。提前致谢!
回答我自己的问题,因为没有人回答,这可能对以后的其他人有用。我被推荐使用 "half-way" 全局,通过编写一个看起来像这样的中间模块:
from my_db_class import Database
db = Database( 'user', 'password', 'database' )
然后在 Queue
和 User
class 中,做这样的事情:
from my_db_instantiation import db
然后您可以在每个需要它的 class 中访问同一个 db
数据库对象。请注意,只有 my_db_intermediary
直接导入 my_db_class
。所有其他模块都导入 my_db_intermediary
。它可能看起来有点令人费解,但它允许您将 class 实现与实例化它们所需的参数分开,在本例中是数据库 class 及其相关凭据。
我有一个围绕 MySQL 数据库的简单 Python 包装器,我需要能够从 Python 中的其他自定义 class 对象访问它。包装器 class 存在于每个其他自定义 class 的单独文件中。到目前为止,我只能找到以下处理方法:
- 使数据库对象成为全局对象(不好)
- 将数据库对象传递给每个其他对象的构造函数(不优雅)
- 完全停止使用数据库包装器class(烦人)
在 Python 中肯定有更好的方法来执行此操作(是的,我搜索了网络和 Stack Overflow,但显然我正在搜索错误的关键字)。任何人都可以解释它是什么吗?我只需要一个数据库连接,而我的大多数其他 classes 都需要使用它。虚拟 Python 代码解释了我正在尝试做的事情。
(部分)数据库包装器 class:
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, ) )
另一个 class 需要访问数据库(N.B。class 方法中未声明的对象 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()
访问数据库的第三个 class(N.B。class 方法中未声明的对象 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 中这种情况的理解。提前致谢!
回答我自己的问题,因为没有人回答,这可能对以后的其他人有用。我被推荐使用 "half-way" 全局,通过编写一个看起来像这样的中间模块:
from my_db_class import Database
db = Database( 'user', 'password', 'database' )
然后在 Queue
和 User
class 中,做这样的事情:
from my_db_instantiation import db
然后您可以在每个需要它的 class 中访问同一个 db
数据库对象。请注意,只有 my_db_intermediary
直接导入 my_db_class
。所有其他模块都导入 my_db_intermediary
。它可能看起来有点令人费解,但它允许您将 class 实现与实例化它们所需的参数分开,在本例中是数据库 class 及其相关凭据。