我从代码中下载所有Airflow变量时遇到问题。
有一个从UI导出的机会,但是我还没有找到以编程方式实现它的任何方法。
我只发现了Variable.get('variable_name')
方法,该方法返回一个Airflow变量。
获取气流变量列表没有变体。
搜索源代码也没有帮助。 你知道一些简单的方法吗?
谢谢。
答案 0 :(得分:2)
您可以使用Airflow CLI将变量导出到文件中,然后从Python代码中读取它。
airflow variables --export FILEPATH
可以通过编程方式使用BashOperator
来实现。
答案 1 :(得分:2)
我喜欢上面关于使用Airflow CLI的答案,但是也可以从纯python的角度提取所有变量(因此无需做任何怪异的技巧)
使用此代码段:
from airflow.utils.db import create_session
from airflow.models import Variable
# a db.Session object is used to run queries against
# the create_session() method will create (yield) a session
with create_session() as session:
# By calling .query() with Variable, we are asking the airflow db
# session to return all variables (select * from variables).
# The result of this is an iterable item similar to a dict but with a
# slightly different signature (object.key, object.val).
airflow_vars = {var.key: var.val for var in session.query(Variable)}
以上方法将查询Airflow sql数据库并返回所有变量。 使用简单的字典理解功能,您可以将返回值重新映射到“普通”字典。
如果db.session.query
无法连接到正在运行的Airflow数据库实例,则会引发sqlalchemy.exc.OperationalError
。
如果您(出于任何原因)希望模拟create_session作为单元测试的一部分,则可以使用以下代码段:
from unittest import TestCase
from unittest.mock import patch, MagicMock
import contextlib
import json
mock_data = {
"foo": {
"bar": "baz"
}
}
airflow_vars = ... # reference to an output (dict) of aforementioned method
class TestAirflowVariables(TestCase)
@contextlib.contextmanager
def create_session(self):
"""Helper that mocks airflow.settings.Session().query() result signature
This is achieved by yielding a mocked airflow.settings.Session() object
"""
session = MagicMock()
session.query.return_value = [
# for the purpose of this test mock_data is converted to json where
# dicts are encountered.
# You will have to modify the above method to parse data from airflow
# correctly (it will send json objects, not dicts)
MagicMock(key=k, val=json.dumps(v) if isinstance(v, dict) else v)
for k, v in mock_data.items()
]
yield session
@patch("airflow.utils.db")
def test_data_is_correctly_parsed(self, db):
db.create_session = self.create_session
self.assertDictEqual(airflow_vars, mock_data)
注意:您必须将补丁程序更改为,但是要在引用的文件中导入create_session
方法。我只能通过导入直到airflow.utils.db
并以上述方法调用db.create_session
来使其工作。
希望这会有所帮助! 祝你好运:)
答案 2 :(得分:0)
在此用例中,我对使用BashOperator有问题,因此我将bashcommand的结果复制到一个变量中,并在程序中使用了它。
import subprocess
output = (subprocess.check_output("airflow variables", shell=True)).decode('utf-8').split('pid=')[1].split()[1:-1]
print(output)