【问题标题】:what is the best creational pattern to apply for class to access different databases申请类以访问不同数据库的最佳创建模式是什么
【发布时间】:2021-03-27 15:07:38
【问题描述】:

我有一个用 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、工厂方法)?目的是尽量减少重复

【问题讨论】:

  • classself 而方法没有?您应该将您的问题建立在 working 示例上。
  • @KlausD.code 已更新
  • 这些类在我看来完全一样...它们有什么不同吗?
  • @juanpa.arrivillaga 类适用于不同的数据库。我不想在此处放置有关架构的任何信息。这就是为什么它们看起来都一样。
  • @CCCCos 不会将该信息硬编码到您的类中,而是使用一个类并将其作为参数传递给您的构造函数。

标签: python design-patterns


【解决方案1】:

您可能想为 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')

【讨论】:

    【解决方案2】:

    我不确定我是否明白你在问什么。如果您尝试在数据库上调用这些定义,则需要定义它们。因为他们什么都不做。如果它们是 python 库或其他模块中已经存在的函数,那么您根本不需要将它们放在一个类中。您可以在定义它们后在数据库上调用它们。

    【讨论】:

      【解决方案3】:

      我不确定我是否明白你在问什么。如果您尝试在数据库上调用这些定义,则需要定义它们。因为他们什么都不做。如果它们是 python 库或其他模块中已经存在的函数,那么您根本不需要将它们放在一个类中。您可以在定义它们后在数据库上调用它们。

      另外,如果你想让函数成为类的属性,那么你需要一个__init__() 构造函数。像这样:

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

      【讨论】:

      • 您好,感谢您的回复。让我重新表述我的问题。我有5个类似的课程。都有类似的功能,如连接/选择/插入。我想重写它们以尽可能减少重复。例如,我可以创建一个抽象类并让这些类从抽象类继承。我想知道这样做是否是个好主意
      • 好的,所以使用类继承。定义类时,将其从要复制的类继承。它将自动具有所有相同的属性。它看起来像这样。
      • `class copyCat(Cat):
      • cat 是继承自的类
      • 上课前不要打勾,那是类型错误
      猜你喜欢
      • 2010-09-11
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多