4

可能是一个非常常见的问题,但还没有找到合适的答案..

我有一个(带有 C++ 模块的 Python)应用程序,它大量使用 SQLite 数据库,并且它的路径由用户在应用程序启动时提供。

每次应用程序的某些部分需要访问数据库时,我计划获取一个新会话并在完成后将其丢弃。为此,我显然需要访问启动时提供的路径。我看到它发生的几种方式:

1. 明确的论点

数据库路径通过显式参数传递到它需要的任何地方,并且数据库会话使用该显式路径进行实例化。这可能是最模块化的,但似乎非常尴尬。

2. 数据库路径单例

数据库会话对象如下所示:

import foo.options
class DatabaseSession(object):
    def __init__(self, path=foo.options.db_path):
        ...

我认为这是一个不那么邪恶的单例,因为我们只存储常量字符串,在应用程序运行时不会改变。这样就可以在DatabaseSession必要时覆盖默认值并对该类进行单元测试。

3.数据库路径单例+静态工厂方法

也许比上述略有改进:

def make_session(path=None):
    import foo.options
    if path is None:
        path = foo.options.db_path
    return DatabaseSession(path)

class DatabaseSession(object):
    def __init__(self, path):
        ...

这种方式模块根本不依赖foo.options,除非我们使用工厂方法。此外,该方法可以执行诸如会话缓存之类的东西。

还有其他模式,我不知道。我在 web 框架中隐约看到类似的东西,但我对这些没有任何经验。我的示例非常具体,但我想它也会扩展到其他应用程序设置,因此是帖子的标题。

我想听听你的想法,什么是最好的安排方式。

4

1 回答 1

2

是的,还有其他人。您的选项 3 虽然非常 Pythonic。

使用标准 Python 模块来封装选项(这是 Django 等 Web 框架的方式)

使用工厂发出正确配置的会话。

既然 SQLite 已经有了一个“连接”,为什么不使用它呢?您的DatabaseSession班级添加了内置连接缺少的什么?

于 2009-04-09T18:43:09.597 回答