以编程方式更新Airflow中的连接时出现问题

时间:2019-09-02 19:46:04

标签: connection airflow airflow-scheduler

我正在尝试使用python更新Airflow连接。我创建了一个python函数,该函数从API获取身份验证令牌并更新Airflow中的额外连接字段。

我正在获取json格式的令牌,如下所示:

def set_token():
    # Get token from API & update the Airflow Variables
    Variable.set("token", str(auth_token))
    new_token = Variables.get("token")
    get_conn = Connection(conn_id="test_conn")
    auth_token = { "header" : new_token}
    get_conn.set_extra(str(auth_token))

下面是我正在使用的python代码的一部分

toString()

但是当我运行任务时,气流连接中的多余字段不会更新。我可以看到我的变量正在更新,但没有更新。有人可以让我知道我在想什么吗?

1 个答案:

答案 0 :(得分:0)

我怀疑您是否以正确的方式从Airflow的meta-db获取连接。

  • 如果您通过Variable.get() method来获取Variable,那么所有事情都不应该Connection得到相同的待遇(尽管Connection class没有{{ 1}}函数,必须有变通方法)?
  • 在这里,您仅使用给定的get()参数实例化Connection对象(而不是从db真正获取该conn_id的Connection)

每当我必须利用基础的conn_id模型时,我都会着眼于SQLAlchemy。从connections()函数中获取线索,这就是我认为应该起作用的

cli.py

请注意,这里我们用更新的字段简单地覆盖了Connection(无需先删除现有字段),而我发现它可以正常工作。如果遇到问题,可以先删除现有连接,然后再使用from airflow.models import Connection from airflow.settings import Session from airflow.utils.db import provide_session from typing import List, Dict, Any, Optional from sqlalchemy.orm import exc @provide_session def update_conn_extra(conn_id: str, new_extra: Any, session: Optional[Session] = None) -> Optional[Connection]: try: my_conn: Optional[Connection] = (session .query(Connection) .filter(Connection.conn_id == conn_id) .one()) except exc.NoResultFound: my_conn: Optional[Connection] = None except exc.MultipleResultsFound: my_conn: Optional[Connection] = None if my_conn: my_conn.extra: Any = new_extra session.add(my_conn) session.commit()

编写更新的连接。