Если очиститель здесь не обязательно подразумевает краткость, то вот что может сработать
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