在执行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本身中了解是否添加了连接。如果已经存在,那么我将不会创建新的连接。
答案 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)
希望这可能对某人有所帮助! :)