SDK
Yandex Query построен на основе внешних таблиц YDB
C помощью YDB SDK возможно использование Yandex Query в различных языках программирования:
Полный перечень SDK платформы YDB см. на странице ydb-platform на GitHub
Все примеры ниже приведены для Python SDK. SDK для других языков разработки устроены аналогично, и все подходы применимы и к ним с точностью до реализации каждого конкретного SDK.
Аутентификация
Yandex Query является полностью управляемым сервисом и для аутентификации использует механизмы IAM.
Аутентификация может быть выполнена с помощью:
Для аутентификации любым перечисленным методом можно использовать существующие методы SDK
В данном примере для аутентификации будет использоваться авторизованный ключ. Для создания авторизованного ключа выполните следующие шаги:
- Создайте сервисный аккаунт с ролью
yq.editor. - Создайте авторизованный ключ доступа для сервисного аккаунта, созданного ранее. Сохраните авторизованный ключ доступа в файл в формате JSON.
Подключение
Для подключения к Yandex Query необходимо создать объект ydb.Driver с указанием параметров подключения и данных для аутентификации:
auth_key_file = "<path_to_auth_key_file>"
with ydb.Driver(endpoint="grpcs://grpc.yandex-query.cloud.yandex.net:2135",
database="/<folder_id>",
credentials=ydb.iam.ServiceAccountCredentials.from_file(auth_key_file)) as driver:
driver.wait(timeout=5, fail_fast=True)
Где:
endpoint— эндпоинт для подключения к источнику данных. Yandex Query использует фиксированный адресgrpcs://grpc.yandex-query.cloud.yandex.net:2135.database— идентификатор каталога, в котором вы хотите запускать запросы. Перед идентификатором каталога должен содержаться префикс/.credentials— реквизиты для аутентификации в Yandex Cloud.
Выполнение запроса
Для выполнения запроса необходимо открыть сессию к Yandex Query и в рамках нее выполнить SQL-запрос:
with ydb.SessionPool(driver) as pool:
def callee(session):
result_sets = session.transaction(ydb.SerializableReadWrite()).execute(
"""
SELECT 'Hello, world!' AS message;
""",
commit_tx=True,
)
...
return pool.retry_operation_sync(callee)
YDB поддерживает несколько способов выполнения запроса: обычный, scripting-запрос, скан-запрос
Примечание
Yandex Query на данный момент поддерживает только scripting-запросы.
Получение результатов запроса
Получить возвращаемые значения можно следующим образом:
for row in result_sets[0].rows:
print(row.message)
return result_sets[0]
Примечание
Yandex Query поддерживает многократное получение результатов запроса по его идентификатору. При работе через YDB SDK такая возможность в данный момент отсутствует.
Полный пример
Ниже приведен пример работы с Yandex Query с помощью YDB Python SDK.
Полный пример
Установите необходимые Python-модули:
python3 -m pip install ydb
python3 -m pip install requests
python3 -m pip install "ydb[yc]"
Выполните следующий пример, указав необходимые для работы параметры:
import ydb
import ydb.iam
auth_key_file = "<path_to_auth_key_file>"
def main():
with ydb.Driver(endpoint="grpcs://grpc.yandex-query.cloud.yandex.net:2135",
database="/<folder_id>",
credentials=ydb.iam.ServiceAccountCredentials.from_file(auth_key_file)) as driver:
driver.wait(timeout=5, fail_fast=True)
with ydb.SessionPool(driver) as pool:
def callee(session):
# New transaction in serializable read write mode.
# If query successfully completed you will get result sets.
# Otherwise exception will be raised.
result_sets = session.transaction(ydb.SerializableReadWrite()).execute(
"""
select 'Hello, world!' as message
""",
commit_tx=True,
)
for row in result_sets[0].rows:
print(row.message)
pool.retry_operation_sync(callee)
if __name__ == "__main__":
main()