首页 > 解决方案 > 这是pythonic,即用户上下文管理器的正确方法吗

问题描述

我们有一些代码可以创建到 Oracle 数据库的 SDE 连接。我想创建一个包装类,使连接更易于管理。我尝试这样做是pythonic吗?

通常在我们的 Python 代码中,我们希望在同一个脚本中以几种不同的方式连接到同一个数据库。例如:

现在我们有一个本土网站包,可以为我们完成大部分工作。但它有两个我遇到的问题:

    import security
    from _ceaconnection import createConnection
    from _ceaconnection import deleteConnection
    import cx_Oracle
    from contextlib import contextmanager


    class ConnectionHelper:

        def __init__(self, database):
            self.database = database
            self.temp_path = security.tmpPath

        @contextmanager
        def sde_dba_connection(self, user, version=None):
            """
            Create dba sde connection
            :param version: sde version
            :param user: sde user (schema)
            :return: sde connection
            """
            connection = None
            try:
                password = security.get_password(self.database, user.lower())
                credentials = dict(server=self.database, user=user, password=password)
                connection = createConnection(credentials, self.temp_path, version=version)
                yield connection
            finally:
                if connection is not None:
                    deleteConnection(connection)

        @contextmanager
        def sde_osa_connection(self, version=None):
            """
            Create osa sde connection
            :param version: sde version
            :return: sde connection
            """
            connection = None
            try:
                connection = createConnection("OS", self.temp_path, server=self.database, version=version)
                yield connection
            finally:
                if connection is not None:
                    deleteConnection(connection)

        @contextmanager
        def oracle_connection_with(self, user):
            """
            create cx_oracle connection
            :param user: oracle user
            :return: oracle connection
            """
            password = security.get_password(self.database, user.lower())
            with cx_Oracle.connect("{u}/{p}@{db}".format(u=user, p=password, db=self.database)) as connection:
                yield connection

此代码在调用时似乎按预期工作:

connection_helper = ceaarcpy.ConnectionHelper('database')
    with connection_helper.sde_dba_connection('sde') as conn:
        # do some stuff

标签: pythoncontextmanager

解决方案


推荐阅读