Как создать экземпляр объекта dbt NodeSelector с помощью API ядра Python dbt?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как создать экземпляр объекта dbt NodeSelector с помощью API ядра Python dbt?

Сообщение Anonymous »

Я хочу создать приложение Python, которое, учитывая путь к проекту dbt и строку селектора dbt (), возвращает полные имена таблиц и представлений, которые будут запрашиваться при запуске dbt run --select < мой_селектор>. По сути, я хочу знать, какие таблицы и представления в моей базе данных выступают в качестве источников моделей, выбранных с помощью .
Я считаю, что класс NodeSelector из базового API Python ядра dbt может мне здесь помочь, но я возникли некоторые проблемы при попытке использовать этот класс. Конструктор этого класса ожидает, что я предоставлю график dbt (dbt.graph.graph.Graph) и манифест dbt (dbt.contracts.graph.manifest.Manifest), но когда я делаю это и запускаю свой код, я получаю ошибку TypeError. : объект 'dict' не может быть вызван.
Из того, что я исследовал, ошибка, похоже, возникает в строке 53 файл core/dbt/graph/selector.py, в котором вызывается функция .nodes(). Кажется, что Python разрешает узлы как объект dict, и они не могут быть вызваны, поэтому я получаю эту ошибку TypeError всякий раз, когда пытаюсь создать экземпляр объекта из этого класса.
Вот минимальный воспроизводимый пример пример (предполагается, что существует проект dbt, который в какой-то момент был успешно запущен — существует файл манифеста.json):

Код: Выделить всё

import json
import os

from dbt.contracts.graph.manifest import Manifest
from dbt.graph.graph import Graph
from dbt.graph.selector import NodeSelector

dbt_project_dir = ""

manifest_path = os.path.join(dbt_project_dir, "target", "manifest.json")
with open(manifest_path, "r") as f:
manifest_json = json.load(f)
manifest = Manifest.from_dict(manifest_json)
my_graph = Graph(manifest)

# This line errors with a message saying: TypeError: 'dict' object is not callable
NodeSelector(graph=my_graph, manifest=manifest)
Забавно то, что если вместо создания экземпляра объекта NodeSelector мы запускаем следующие строки:

Код: Выделить всё

try:
print(type(my_graph.nodes))
print(my_graph.nodes())
except Exception as exc:
print(exc)
На выходе мы получаем следующее:

Код: Выделить всё

'dict' object is not callable
Это довольно странно, поскольку функция type() разрешает my_graph.nodes как метод, но когда я пытаюсь ее вызвать, она обрабатывается как dict.< /p>
Есть идеи по поводу того, что здесь происходит? Я думаю, что это может быть как-то связано со свойством nodes Digraph сетиx, которое может возвращать объект или метод, похожий на dict, но я не уверен. Может кто-нибудь помочь мне создать экземпляр этого класса?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... python-api
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»