导出所有气流变量

时间:2018-11-08 10:39:32

标签: python airflow

我从代码中下载所有Airflow变量时遇到问题。
有一个从UI导出的机会,但是我还没有找到以编程方式实现它的任何方法。

我只发现了Variable.get('variable_name')方法,该方法返回一个Airflow变量。 获取气流变量列表没有变体。

搜索源代码也没有帮助。 你知道一些简单的方法吗?

谢谢。

3 个答案:

答案 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)