通过python运算符检查气流连接列表

时间:2019-06-17 07:06:47

标签: airflow

在执行DAG之前,我想检查连接列表中是否存在特定的连接ID。我没有任何保持联系的机制。即使我通过GUI创建连接,服务器重新启动时,所有连接也会被删除。

以下是我认为应该添加的任务,但是当我运行它时出现了一个ascii错误,可能是因为该命令返回了记录器可能未充分分析的表。

def create_connection(**kwargs):
    print(kwargs.get('ds'))

list_conn = BashOperator(
    task_id='list_connections',
    bash_command='airflow connections --l',
    xcom_push=True)

conns = list_conn.execute(context=kwargs)
logging.info(conns)

if not conns:
    new_conn = Connection(conn_id='xyz', conn_type='s3',
                          host='https://api.example.com')
    session = settings.Session()
    session.add(new_conn)
    session.commit()
    logging.info('Connection is created')

问题:我有什么办法可以在Airflow DAG本身中了解是否添加了连接。如果已经存在,那么我将不会创建新的连接。

2 个答案:

答案 0 :(得分:1)

session.query(Connection)应该可以解决问题。

def list_connections(**context):
    session = settings.Session()
    return session.query(Connection)

list_conn = PythonOperator(
    task_id='list_connections',
    python_callable=list_connections,
    provide_context=true,
)

请确保所有代码都包含在任务中。为了正确地表达它,它们应该在run time而不是load time期间执行。直接在DAG文件中添加代码会导致它在加载期间运行,因此不建议这样做。

答案 1 :(得分:1)

可接受的答案非常有效。我有一种情况,我需要通过连接ID获取连接以创建DAG。因此,我必须在任务之外以及DAG创作本身中获取它。 以下代码对我有用:

from airflow.hooks.base_hook import BaseHook

conn = BaseHook.get_connection(connection)

希望这可能对某人有所帮助! :)