我有一个围绕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, ) )
另一个需要访问数据库的类(类方法中的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中处理这种情况的理解。提前谢谢!
答案 0 :(得分:0)
回答我自己的问题,因为没有人回应,这可能对将来的其他人有用。我建议使用“中途”全局,编写一个看起来像这样的中间模块:
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
。它可能看起来有点复杂,但它允许您将类实现与实例化它们所需的参数分开,在本例中是数据库类及其相关凭证。