DLT обрабатывает исключения вызовов APIPython

Программы на Python
Ответить
Anonymous
 DLT обрабатывает исключения вызовов API

Сообщение Anonymous »

Я получаю данные из нескольких API-интерфейсов gitlab: репозиториев, к которым у меня есть доступ, участников и связанных с ними исполнителей. Некоторые вызовы API возвращают запрещенную ошибку 403.
Мне нужно управлять этими ошибками в конвейере DLT

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

import gitlab
gl = gitlab.Gitlab(url="https://gitlab.xxx.xxx.com/",private_token=token)
import dlt
from dlt.destinations import postgres

@dlt.source
def gitlab_source():
@dlt.resource(table_name="repositories",
primary_key=("id"))
def get_repositories():
projects = gl.projects.list(get_all=True)
for project in projects :
yield project

@dlt.resource(table_name="members")
@dlt.transformer(data_from=get_repositories)
def get_members(repo_item):
try :
members = repo_item.members_all.list(iterator=True)
except Exception as e:
print("Members",e)
members = []

for member in members :
yield {'project_id' : repo_item.id,
'id' : member.id,
'name' : member.name,
'username' : member.username,
'acces_level' :member.access_level
}

@dlt.resource(table_name="runners")
@dlt.transformer(data_from=get_repositories)
def get_runners(repo_item):
try :
runners = repo_item.runners.list(iterator=True)
except Exception as e:
print(repo_item.name,e)
runners = []
for runner in runners :
print(repo_item.name, "Coucou !!")
data = runner.attributes
data['project_id'] = repo_item.id
yield data

return [get_repositories,
get_members,
get_runners]

def run_pipeline() :
print('Pipeline lancée')
pipeline = dlt.pipeline(
pipeline_name="gitlab_pipeline",
destination=postgres(credentials="postgres://postgres:password@localhost:5432/postgres"),
dataset_name="gitlab"
)
load_info = pipeline.run(gitlab_source())

print(load_info)

run_pipeline()
Я пробовал добавлять везде try/Exception, но это очень громоздко.
Я хочу добавить коммиты, ветки, merge_requets и многое другое, а структура кода всегда одна и та же: выберите один метод (repo.members_all, repo.runners, repo.mergerequests...), некоторые атрибуты для заполнения моей базы данных Postgres (id, имя, имя пользователя или другие), а затем добавьте некоторые попробуйте/кроме, чтобы предотвратить сбой и заполнение моей базы данных нулевыми значениями.
Мне хотелось бы найти более умный способ сделать это.
Я пробовал создать функцию-декоратор для try/Exception, но не уверен, что это правильный путь с dlt.
Есть ли в DLT встроенные функции, о которых я не знаю, для обработки ошибок вызовов API?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/798 ... exceptions
Ответить

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

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

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

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

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