Лучшая реализация Pluggable Database в Python через шаблон Singleton + Factory и наследование - PullRequest
0 голосов
/ 15 мая 2019

Я внедряю сменную систему хранения для промежуточного программного обеспечения в Python с Flask.

Я хотел бы запустить мою программу и создать базу данных. Эта база данных может быть CouchDB, локальной файловой системой и т. Д. Она называется "configuration_store" Остальная часть программы должна иметь доступ к этой базе данных.

На данный момент это выглядит так:

У меня есть папка / api с init .py и в начале этого файла у меня есть

...
configuration_store = ConfigurationStoreFactory.create("CouchDB")
config = Config()
...

Например, класс Config должен иметь доступ к единственному экземпляру хранилища configuration_store. Например, он должен иметь возможность делать что-то вроде store.getstoreurl ().

В папке / configuration_store у меня есть 4 файла: __init__py, configurtion_store_factory.py, couchDB_store.py и local_file_system_store.py.

В init .py У меня есть:

from simplekv import KeyValueStore
from abc import ABCMeta, abstractmethod, abstractproperty

class ConfigurationStore(type, KeyValueStore):
    __metaclass__ = ABCMeta

    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(ConfigurationStore, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

    @abstractmethod    
    def getConfigurationStoreTenantUrl(self, database):
        pass

    @abstractproperty
    def configuration_store_url(self):
        pass

На моем заводе у меня есть

class ConfigurationStoreFactory():

    def __init__(self, logger_name):
        self.logger = Logger(logger_name)

    @staticmethod
    def create(type):
        if type == "CouchDB":
            from couchDB_store import CouchDBStore
            store = CouchDBStore()
        elif type == "LFS" or type == "LocalFileSystemStore":
            from local_file_system_store import LocalFileSystemStore
            store = LocalFileSystemStore('./data')
        else: #assume LFS
            from simplekv.fs import FilesystemStore
            store = FilesystemStore('./data')
        return store

В CouchDB_store.py у меня есть

    from configuration_store import ConfigurationStore

class CouchDBStore(ConfigurationStore):
    configuration_store_url = None

    #Instantiate this later since we need access to the config to get it correct
    def __init__(self):
        super(CouchDBStore,self).__init__('CouchDBStore')

        self.configuration_store_url = "https://"+ self.manager.config.getConfigKey("couchDbAdmin")+":" +self.config.getConfigKey("couchDbPassword")+"@" \
            +  self.config.getConfigKey("couchDbHostHttp") + ":"+ self.config.getConfigKey("couchDbPort")+"/"

Это не работает: я получаю жалобы на "Абстрактный класс 'CouchDBStore' с экземплярами абстрактных методов" на фабрике. У меня также есть чувство, что я путаю вещи, и это не очень хороший подход.

Сложность состоит в том, что я хочу наследовать от пакета Python simplekv, но также хочу создать подкласс для своих собственных типов баз данных и сделать весь этот пакет доступным как одноэлементный, так что будет создана только одна база данных, и она будет доступна для остальных программы.

Что было бы хорошим способом приблизиться к этому? Я думал о том, чтобы сбросить Factory и просто выполнить инициализацию один раз в init .py и определить тип базы данных там. Но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...