通过Singleton+Factory模式和inheritan在Python中更好地实现可插入数据库

2024-09-30 03:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Flask为Python中间件实现一个可插拔存储系统

我想做的是启动我的程序,让它创建一个数据库。 该数据库可以是CouchDB、本地文件系统等。它被称为“配置存储” 程序的其余部分应该可以访问此数据库

目前看起来是这样的:

我有一个带有init.py的/api文件夹,在这个文件的开头有

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

例如,Config类应该能够访问配置存储的唯一实例。例如,它应该能够执行类似store.getstoreurl()的操作

在/configuration\u store文件夹中,我有4个文件:\u init\u py、configuration\u store\u factory.py、couchDB\u store.py和local\u file\u system\u 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,但也希望将其子类化为我自己的数据库类型,并将整个包作为一个单例提供,以便只创建一个数据库,并且程序的其余部分可以访问它

有什么好办法来解决这个问题? 我正在考虑放弃工厂,只在init.py中初始化一次,然后确定那里的数据库类型。但我不确定


Tags: storefrompyimportselfconfig数据库init

热门问题