Перейти к основному содержимому

Python SDK

Python SDK для разработки программного обеспечения dbt-sl-sdk (SDK) — это библиотека на Python, которая предоставляет вам легкий доступ к dbt Semantic Layer с помощью Python. Она позволяет разработчикам взаимодействовать с API dbt Semantic Layer и запрашивать метрики и измерения в последующих инструментах.

Установка

Для установки Python SDK вам нужно указать дополнительные зависимости в зависимости от того, хотите ли вы использовать его синхронно, с поддержкой requests, или асинхронно (asyncio с поддержкой aiohttp).

Python SDK поддерживает версии Python с долгосрочной поддержкой (LTS), такие как 3.9, 3.10, 3.11 и 3.12. Когда Python прекращает поддержку версии, Python SDK также прекращает поддержку этой версии. Если вы используете неподдерживаемую версию, вы можете столкнуться с проблемами совместимости и не получите обновления или исправления безопасности от SDK.

Синхронная установка означает, что ваша программа ждет завершения каждой задачи перед переходом к следующей.

Это проще, легче для понимания и подходит для небольших задач или когда вашей программе не нужно обрабатывать много задач одновременно.

pip install "dbt-sl-sdk[sync]"

Если вы используете асинхронные фреймворки, такие как FastAPI или Strawberry, установка синхронной версии SDK заблокирует ваш цикл событий и может значительно замедлить вашу программу. В этом случае мы настоятельно рекомендуем использовать асинхронную установку.

Использование

Чтобы выполнять операции с API Semantic Layer, создайте экземпляр SemanticLayerClient с вашими параметрами подключения к API:

from dbtsl import SemanticLayerClient

client = SemanticLayerClient(
environment_id=123,
auth_token="<your-semantic-layer-api-token>",
host="semantic-layer.cloud.getdbt.com",
)

# запрос первой метрики по `metric_time`
def main():
with client.session():
metrics = client.metrics()
table = client.query(
metrics=[metrics[0].name],
group_by=["metric_time"],
)
print(table)

main()

Примечание: Все вызовы методов, обращающихся к API, должны находиться в контексте client.session(). Это позволяет клиенту установить соединение с API только один раз и повторно использовать то же соединение между вызовами API.

Мы рекомендуем создавать сессию на уровне всего приложения и повторно использовать ту же сессию в течение всего приложения для оптимальной производительности. Создание сессии для каждого запроса не рекомендуется и неэффективно.

Использование asyncio

Если вы используете asyncio, импортируйте AsyncSemanticLayerClient из dbtsl.asyncio. API SemanticLayerClient и AsyncSemanticLayerClient идентичны, но асинхронная версия имеет асинхронные методы, которые нужно await.

import asyncio
from dbtsl.asyncio import AsyncSemanticLayerClient

client = AsyncSemanticLayerClient(
environment_id=123,
auth_token="<your-semantic-layer-api-token>",
host="semantic-layer.cloud.getdbt.com",
)

async def main():
async with client.session():
metrics = await client.metrics()
table = await client.query(
metrics=[metrics[0].name],
group_by=["metric_time"],
)
print(table)

asyncio.run(main())

Интеграция с библиотеками для работы с данными

Python SDK возвращает все данные запросов в виде таблиц pyarrow.

Библиотека Python SDK не поставляется в комплекте с Polars или Pandas. Если вы используете эти библиотеки, добавьте их в зависимости вашего проекта.

Чтобы использовать данные с такими библиотеками, как Polars или Pandas, вручную преобразуйте данные в нужный формат. Например:

Если вы используете pandas

# ... инициализация клиента

arrow_table = client.query(...)
pandas_df = arrow_table.to_pandas()

Если вы используете polars

import polars as pl

# ... инициализация клиента

arrow_table = client.query(...)
polars_df = pl.from_arrow(arrow_table)

Примеры использования

Для дополнительных примеров использования ознакомьтесь с примерами использования, некоторые из которых включают:

Отключение телеметрии

По умолчанию, Python SDK отправляет некоторую информацию о платформе в dbt Labs. Чтобы отказаться от этого, установите атрибут PLATFORM.anonymous в True:

from dbtsl.env import PLATFORM
PLATFORM.anonymous = True

# ... инициализация клиента

Вклад

Чтобы внести вклад в этот проект, ознакомьтесь с нашими руководствами по вкладу и откройте GitHub issue или pull request.

0