Получить полный URI подключения из крючка Airflow Postgres - PullRequest
1 голос
/ 30 апреля 2020

Есть ли более удобный способ получить полный URI из Postgres ловушки? .get_uri() не содержит «лишних» параметров, поэтому я добавляю их следующим образом:

def pg_conn_id_to_uri(postgres_conn_id):
    hook = PostgresHook(postgres_conn_id)
    uri = hook.get_uri()

    extra = hook.get_connection(postgres_conn_id).extra_dejson
    params = [ f'{k}={v}' for k, v in extra.items() ]

    if params:
        params = '&'.join(params)
        uri += f'?{params}'

    return uri

1 Ответ

1 голос
/ 30 апреля 2020

Если очиститель здесь не обязательно подразумевает краткость, то вот что может сработать

from typing import Dict, Any

from psycopg2 import extensions

from airflow.hooks.postgres_hook import PostgresHook
from airflow.models.connection import Connection


def pg_conn_id_to_uri(postgres_conn_id: str) -> str:
    # create hook & conn
    hook: PostgresHook = PostgresHook(postgres_conn_id=postgres_conn_id)
    conn: Connection = hook.get_connection(conn_id=postgres_conn_id)
    # retrieve conn_args & extras
    extras: Dict[str, Any] = conn.extra_dejson
    conn_args: Dict[str, Any] = dict(
        host=conn.host,
        user=conn.login,
        password=conn.password,
        dbname=conn.schema,
        port=conn.port)
    conn_args_with_extras: Dict[str, Any] = {**conn_args, **extras}
    # build and return string
    conn_string: str = extensions.make_dsn(dsn=None, **conn_args_with_extras)
    return conn_string

Обратите внимание, что фрагмент не проверен


Конечно, мы все еще можем отсечь еще несколько строк отсюда (например, используя синтаксис python c sugar conn.__dict__.items()), но я предпочитаю ясность, а не краткость


Подсказки имеют взято из Airflow и самого кода pyscopg2

...