什么是应用类访问不同数据库的最佳创建模式



我有一个用python 编写的应用程序

目前大约有5个类用于访问不同的数据库。

这些类的结构如下(我知道它设计得很糟糕(:

class access_db_a:
def __init__(self, db):
self.mydb = None
def connect(self):
mydb = mysql.connector.connect(
host=info["db_2_host"],
user=info["user"],
passwd=info["passwd"],
database=info["db_2"],
)
def select(self):
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM {}".format(TABLE_NAME))
myresult = mycursor.fetchall()
for x in myresult:
print(x)
def insert(self):
mycursor = mydb.cursor()
query = {'queries for db'}
class access_db_b:
def __init__(self, db_2):
self.mydb = None
def connect(self, db_2):        
mydb = mysql.connector.connect(
host=info["db_2_host"],
user=info["user"],
passwd=info["passwd"],
database=info["db_2"],
)
def select(self):
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM {}".format(TABLE_NAME))
myresult = mycursor.fetchall()
for x in myresult:
print(x)
def insert(self):
mycursor = mydb.cursor()
query = {'queries for db_2'}

我的问题是:在这里应用的最佳创意设计模式是什么(即Signleton,Factory Method(?目的是尽量减少重复

您可能需要为mysql定义一个基类。这个类可以在一个文件中分离,也许可以作为您自己的库。

class mysqlBase():
def __init__(self, host, user, passwd, database):
self.host       = host
self.user       = user
self.passwd     = passwd
self.database   = database
self.db         = None
def connect(self,):
self.db = mysql.connector.connect(
host        = self.host,
user        = self.user,
passwd      = self.passwd,
database    = self.database,
)
def select(self, tbl):
mycursor = self.db.cursor()
mycursor.execute("SELECT * FROM {}".format(tbl))
myresult = mycursor.fetchall()
for x in myresult:
print(x)
# more functions
# ...

然后在你的课堂上使用

class access_db_a():
def __init__(self, host, user, passwd, database):
self.mydb = mysqlBase(host, user, passwd, database)
def connect(self,):
self.mydb.connect()
def select(self, tbl):
self.mydb.select(tbl)
# more functions refer to mysqlBase()
# ...

或具有类继承,

class access_db_a(
mysqlBase
):
def __init__(self, host, user, passwd, database):
mysqlBase.__init__(self, host, user, passwd, database)
# No need to define connect(), unless you wanna override it
# No need to define select(),  unless you wanna override it

最后,在代码中,将类作为对象调用。

# Const
info = {                         # just some database const
'A': {
"host": "192.128.0.123",
"id": "AAA",
"pw": "aaa",
"db": "whatever",
},
}
dbA = access_db_a(**info['A'])   # pass the login detail to your class
dbA.connect()
dbA.select('TABLE_A')

我不确定我是否理解你的要求。如果您试图在数据库上调用这些定义,则需要对它们进行定义。他们什么也不做。如果它们是已经存在于python库或其他模块中的函数,那么您根本不需要将它们放在类中。您可以在定义它们之后在数据库中调用它们。

我不确定我是否理解你的要求。如果您试图在数据库上调用这些定义,则需要对它们进行定义。他们什么也不做。如果它们是已经存在于python库或其他模块中的函数,那么您根本不需要将它们放在类中。您可以在定义它们之后在数据库中调用它们。

此外,如果您试图使函数成为类的属性,那么您需要一个__init__()构造函数。像这样:

class access_db_a():
def __init__(self):
self.connect = connect()
self.select = select()
self.insert = insert()

最新更新