跨模块共享数据库连接

Share Database Connection across modules

我正在尝试从我的代码中的多个位置访问 pyodbc 连接。

目前用户通过命令行传入连接细节,我使用plac.annotation处理它们,问题是,我不知道如何在所有项目中共享这个对象。到目前为止我所拥有的是:

用于存储连接的单例Class

class DatabaseInstance:
    """
    Singleton Class holding a Database Connection
    """

    class __DatabaseInstance:
        def __init__(self, server, database, schema, table, user, password):
            self.server = server
            self.database = database
            self.schema = schema
            self.table = table
            self.username = user
            self.passw = password

        def __str__(self):
            return "{} DB: {}@[{}].[{}].[{}] @ {}".format(
                repr(self),
                self.server,
                self.database,
                self.schema,
                self.table,
                self.username,
            )

        def get_connection(self):
            """
            TODO
            """
            if DatabaseInstance.connection:
                return DatabaseInstance.connection
            else:
                DatabaseInstance.connection = pyodbc.connect(
                    "DRIVER=SQL Server;SERVER="
                    + self.server
                    + ";PORT=1433;DATABASE="
                    + self.database
                    + ";UID="
                    + self.username
                    + ";PWD="
                    + self.passw
                )
                return DatabaseInstance.connection

    instance = None
    connection = None

    def __init__(self, server, database, schema, table, user, password):
        if not DatabaseInstance.instance:
            DatabaseInstance.instance = DatabaseInstance.__DatabaseInstance(
                server, database, schema, table, user, password
            )

    def __getattr__(self, name):
        return getattr(self.instance, name)

现在,在我的 main 中,我获取了参数,并为数据库创建了一个实例:

connection = DatabaseInstance(
    server=server,
    database=database,
    schema=schema,
    table=table,
    user=user,
    password=passw,
)

应用程序需要从不同的模块和子模块访问这个对象,但是connection在一个函数的范围内。

除了将此对象从一个函数传递到另一个函数直到它被必要的函数使用之外,还有更好的方法吗?

不要在你的 main 中实例化单例。在模块中将 DatabaseInstance 实例化为 db,当您需要访问单例时,进入模块并使用它。

import .thatmodule
db = thatmodule.db.get_connection()

在您的 main 中实例化并将其传递到需要访问数据库的代码中以回答您的最后一个问题是非常好的。不过,这会使 API 更加丑陋。

两个都很好。选择权在你。