Airflow Plugin - создайте собственную модель и используйте базу метаданных воздушного потока для хранения специфических данных плагина - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь написать плагин воздушного потока, который добавляет кнопку меню, новый вид и конечную точку API.Кроме того, мне нужно прочитать и сохранить некоторые данные в таблице базы данных, которую плагин должен создать, когда воздушный поток подхватывает их.

Проблема существует, когда у меня есть 2 файла, назовите их view.py и mymodel.py .В view.py определены все мои представления, кнопки меню и т. Д.

В mymodel.py только модель sqlalchemy (только соответствующие строки и определение разбитой таблицы - см. Ниже)

mymodel.py :

from airflow.models.base import Base

class someDataBase(Base):
    """
    Create Model someDataBase
    """

    print('create table someDataBaseTableName')

    __tablename__ = "someDataBaseTableName"

    id = Column(Integer, primary_key=True)

В view.py я импортирую файл:

from someplugin.models.mymodel import someDataBase

структура папок:

├── plugins
│   └── someplugin
│       ├── __init__.py
│       ├── models
│       │   ├── mymodel.py
│       └── views
│           ├── __init__.py
│           └── view.py

При этом выдается следующее сообщение об ошибке:

{{plugins_manager.py:146}} ОШИБКА - Таблица 'someDataBaseTableName' уже определена для этого экземпляра MetaData.Укажите 'extension_existing = True', чтобы переопределить параметры и столбцы в существующем объекте таблицы.

(кстати: exte_existing = True не решает проблему :()

Я предполагаю проблемузаключается в том, что airflow загружает плагин через plugin_manager, а оператор import снова загружает класс someDataBase. Думаю, можно подтвердить это поведение, если я добавлю некоторые записи в класс someDataBase (назовем его «mylogging» - см. ниже).

airflow  | create table someDataBaseTableName
airflow  | create table someDataBaseTableName

В некотором роде исправление, но не удовлетворительное: если я определяю свою модель someDataBase непосредственно в view.py, она работает.

Любые советы о том, как решить эту проблему, очень приветствуются. Спасибо

...