gpt4 book ai didi

python-3.x - Airflow 插件 - 创建自己的模型并使用 airflow 元数据库来存储插件特定数据

转载 作者:行者123 更新时间:2023-12-05 07:23:54 24 4
gpt4 key购买 nike

我正在尝试编写一个 airflow 插件,它添加了一个菜单按钮、新 View 和一个 api 端点。此外,我需要读取一些数据并将其存储在数据库表中,插件应在 Airflow 接收数据时创建这些数据。

当我有 2 个文件时存在问题让我们将它们命名为 view.pymymodel.py。在 view.py 中定义了我的整个 View 、菜单按钮等。

在 mymodel.py 中只有 sqlalchemy 模型(只有相关的行和剥离的表定义 - 见下文)

我的模型.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”已为此元数据实例定义。指定“extend_existing=True”以重新定义现有表对象上的选项和列。

(顺便说一句:extend_existing=True 不能解决问题 :( )

我假设问题是 Airflow 通过 plugin_manager 加载插件并且 import 语句再次加载 someDataBase 类。如果我在 someDataBase 类中添加一些日志记录,我认为可以确认这种行为(让它命名为“mylogging”——见下文)。

airflow  | create table someDataBaseTableName
airflow | create table someDataBaseTableName

一种修复,但不是令人满意的修复:如果我直接在 view.py 中定义我的 someDataBase 模型,它就可以工作。

非常欢迎任何有关如何解决此问题的建议。谢谢

最佳答案

我正在复制我在 sqlalchemy.exc.InvalidRequestError: Table Already defined 中给出的答案以防有人在使用 Airflow 时遇到这个问题。

I had the same problem, and it turned out models.py was getting imported twice with different __name__.

To debug it, place an

import sys
from pprint import pprint
pprint(list(sys.modules.keys())) # This line prints all imported modules

in the relevant place and look for all models instances. In my case I had something like

[...,
'models',
...,
'package_name.models']

So, in package_name/models.py I wrapped the whole file definition with

if __name__ != 'models':
# original models.py code #

and it solved the duplicated load.

I think there is a more pythonic way of solving the problem, and it is has something to do with telling flask not to see models.py as a module or as a script (not sure which one is the correct one) in an __init__.py file somewhere, but even with all the reading done, I'm still quite confused on how these whole shenaningans work.

关于python-3.x - Airflow 插件 - 创建自己的模型并使用 airflow 元数据库来存储插件特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55679378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com