我正在尝试使用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()
但是当我运行任务时,气流连接中的多余字段不会更新。我可以看到我的变量正在更新,但没有更新。有人可以让我知道我在想什么吗?
答案 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()