【问题标题】:SQLAlchemy engine from Airflow database hook来自 Airflow 数据库挂钩的 SQLAlchemy 引擎
【发布时间】:2020-04-30 17:02:13
【问题描述】:

从 Airflow 连接 ID 获取 SQLAlchemy 引擎的最佳方法是什么?

目前我正在创建一个钩子,检索它的 URI,然后使用它来创建一个 SQLAlchemy 引擎。

postgres_hook = PostgresHook(self.postgres_conn_id)
engine = create_engine(postgres_hook.get_uri())

这可行,但两个命令都会连接到数据库。

当我在连接上有“额外”参数时,需要第三个连接来检索这些参数(请参阅Retrieve full connection URI from Airflow Postgres hook

有没有更短更直接的方法?

【问题讨论】:

    标签: python sqlalchemy airflow


    【解决方案1】:

    需要明确的是,您的命令确实会建立两个数据库连接,但它连接到两个单独的数据库(除非您尝试连接到 Postgres Airflow 数据库)。初始化钩子的第一行不应该建立任何连接。只有第二行首先从 Airflow 数据库中获取连接详细信息(我认为您无法避免),然后使用它连接到 Postgres 数据库(我认为这是重点)。

    你可以稍微简单一些:

    postgres_hook = PostgresHook(self.postgres_conn_id)
    engine = postgres_hook.get_sqlalchemy_engine()
    

    这看起来很干净,但是如果您想在不通过PostgresHook 的情况下获得更直接的信息,您可以通过查询 Airflow 的数据库直接获取它。但是,这意味着您最终将复制代码以从连接对象构建 URI。如果您想继续此操作,底层的implementation of get_connection() 就是一个很好的示例。

    from airflow.settings import Session
    
    conn = session.query(Connection).filter(Connection.conn_id == self.postgres_conn_id).one()
    ... # build uri from connection
    create_engine(uri)
    

    此外,如果您希望能够访问extras 而无需单独的数据库获取超出get_uri()get_sqlalchemy_engine() 所做的,您可以覆盖BaseHook.get_connection() 以将连接对象保存到实例变量中重用。这需要在 PostgresHook 之上创建自己的钩子,所以我知道这可能并不理想。

    class CustomPostgresHook(PostgresHook):
    
        @classmethod
        def get_connection(cls, conn_id):  # type: (str) -> Connection
            conn = super().get_connection(conn_id)
            self.conn_obj = conn  # can't use self.conn because PostgresHook will overriden in https://github.com/apache/airflow/blob/1.10.10/airflow/hooks/postgres_hook.py#L93 by a different type of connection
            return conn
    
    postgres_hook = CustomPostgresHook(self.postgres_conn_id)
    uri = postgres_hook.get_uri()
    # do something with postgres_hook.conn_obj.extras_dejson
    

    一些内置的 Airflow 挂钩已经具有这种行为(grpc、samba、tableau),但它绝对不是标准化的。

    【讨论】:

    • get_sqlalchemy_engine 非常好,谢谢。有没有更简洁的方法来包含连接中的任何“额外”参数?这是我的链接问题的主题
    猜你喜欢
    • 2012-04-04
    • 2021-08-26
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多