---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/dev/example-app.md
  - https://ydb.tech/docs/ru/dev/example-app.md
sourcePath: ru/core/dev/example-app/index.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt


<!-- source: ru/dev/example-app/_includes/index.md -->
# Тестовое приложение

В данном разделе разбирается код однотипного тестового приложения, реализованного с использованием YDB SDK на разных языках программирования:

- [C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md)
- [С#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md)
- [Go](https://ydb.tech/docs/ru/dev/example-app/go/index.md)
- [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md)
- [JavaScript](https://ydb.tech/docs/ru/dev/example-app/example-js.md)
- [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md)
- [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md)

{% node info %}

Дополнительную информацию о том, как работают эти примеры приложений, можно найти в [справочной документации YDB SDK](https://ydb.tech/docs/ru/reference/ydb-sdk/index.md).

{% endnote %}

Тестовое приложение выполняет следующие шаги:

<!-- source: ru/dev/example-app/_includes/steps/01_init.md -->
## Инициализация соединения с базой данных {#init}

Для взаимодействия с YDB создается экземпляр драйвера, клиента и сессии:

* Драйвер YDB отвечает за взаимодействие приложения и YDB на транспортном уровне. Драйвер должен существовать на всем протяжении жизненного цикла работы с YDB и должен быть инициализирован перед созданием клиента и сессии.
* Клиент YDB работает поверх драйвера YDB и отвечает за работу с сущностями и транзакциями.
* Сессия YDB содержит информацию о выполняемых транзакциях и подготовленных запросах и содержится в контексте клиента YDB.
<!-- endsource: ru/dev/example-app/_includes/steps/01_init.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#init) |  [C#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md#init) | [Go](https://ydb.tech/docs/ru/dev/example-app/go/index.md#init) | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#init) | JavaScript | [PHP](https://ydb.tech/docs/ru/dev/example-app/example-php.md#init) | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#init) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#download)

<!-- source: ru/dev/example-app/_includes/steps/02_create_table.md -->
## Создание строковых таблиц {#create-table}

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

- `series` - Сериалы
- `seasons` - Сезоны
- `episodes` - Эпизоды

После создания вызывается метод получения информации об объекте схемы данных, и выводится результат его выполнения.
<!-- endsource: ru/dev/example-app/_includes/steps/02_create_table.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#create-table) |  [C#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md#create-table) | [Go](https://ydb.tech/docs/ru/dev/example-app/go/index.md#create-table) | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#create-table) | JavaScript | [PHP](https://ydb.tech/docs/ru/dev/example-app/example-php.md#create-table) | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#create-table) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#query-client)

<!-- source: ru/dev/example-app/_includes/steps/03_write_queries.md -->
## Запись данных {#write-queries}

Выполняется запись данных в созданные строковые таблицы с использованием команды [`UPSERT`](https://ydb.tech/docs/ru/yql/reference/syntax/upsert_into.md) языка запросов [YQL](https://ydb.tech/docs/ru/yql/reference/index.md). Применяется режим передачи запроса на изменение данных с автоматическим подтверждением транзакции в одном запросе к серверу.
<!-- endsource: ru/dev/example-app/_includes/steps/03_write_queries.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#write-queries) |  [C#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md#write-queries) | Go | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#write-queries) | JavaScript | [PHP](https://ydb.tech/docs/ru/dev/example-app/example-php.md#write-queries) | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#write-queries) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#query-client)

<!-- source: ru/dev/example-app/_includes/steps/04_query_processing.md -->
## Получение выборки данных {#query-processing}

Выполняется запрос на получение выборки данных с использованием команды [`SELECT`](https://ydb.tech/docs/ru/yql/reference/syntax/select/index.md) языка запросов [YQL](https://ydb.tech/docs/ru/yql/reference/index.md). Демонстрируется обработка полученной выборки в приложении.
<!-- endsource: ru/dev/example-app/_includes/steps/04_query_processing.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#query-processing) |  [C#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md#query-processing) | [Go](https://ydb.tech/docs/ru/dev/example-app/go/index.md#query-processing) | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#query-processing) | JavaScript | [PHP](https://ydb.tech/docs/ru/dev/example-app/example-php.md#query-processing) | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#query-processing) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#query-client)

<!-- source: ru/dev/example-app/_includes/steps/06_param_queries.md -->
## Параметризованные запросы {#param-queries}

Выполняется запрос к данным с использованием параметров. Этот вариант выполнения запросов является предпочтительным, так как позволяет серверу переиспользовать план исполнения запроса при последующих его вызовах, а также спасает от уязвимостей вида [SQL Injection](https://ru.wikipedia.org/wiki/Внедрение_SQL-кода).
<!-- endsource: ru/dev/example-app/_includes/steps/06_param_queries.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#param-queries) |  [C#](https://ydb.tech/docs/ru/dev/example-app/example-dotnet.md#param-queries) | [Go](https://ydb.tech/docs/ru/dev/example-app/go/index.md#param-queries) | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#param-queries) | JavaScript | [PHP](https://ydb.tech/docs/ru/dev/example-app/example-php.md#param-queries) | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#param-queries) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#query-client)

<!-- source: ru/dev/example-app/_includes/steps/09_multistep_transactions.md -->
## Многошаговые транзакции {#multistep-transactions}

Выполняется несколько команд в рамках одной многошаговой транзакции. Между выполнением запросов допустимо выполнение работы кода клиентского приложения. Использование  транзакции позволяет гарантировать, что выполненные в её контексте выборки консистентны между собой.
<!-- endsource: ru/dev/example-app/_includes/steps/09_multistep_transactions.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#multistep-transactions) |   C# | Go | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#multistep-transactions) | JavaScript | PHP | Python

<!-- source: ru/dev/example-app/_includes/steps/10_transaction_control.md -->
## Управление транзакциями {#tcl}

Выполняются вызовы операторов управления транзакциями [TCL](https://ydb.tech/docs/ru/concepts/transactions.md) - Begin и Commit.

В большинстве случаев вместо явного использования  вызовов Begin и Commit лучше использовать параметры контроля транзакций в вызовах execute. Это позволит избежать лишних обращений к YDB и эффективней выполнять запросы.
<!-- endsource: ru/dev/example-app/_includes/steps/10_transaction_control.md -->

[C++](https://ydb.tech/docs/ru/dev/example-app/example-cpp.md#tcl) |   C# | Go | [Java](https://ydb.tech/docs/ru/dev/example-app/java/index.md#tcl) | JavaScript | PHP | [Python](https://ydb.tech/docs/ru/dev/example-app/python/index.md#tcl) | [Rust](https://ydb.tech/docs/ru/dev/example-app/rust/index.md#query-client)

<!-- source: ru/dev/example-app/_includes/steps/50_error_handling.md -->
## Обработка ошибок {#error-handling}

Подробно об обработке ошибок написано в разделе [Обработка ошибок в API](https://ydb.tech/docs/ru/reference/ydb-sdk/error_handling.md).
<!-- endsource: ru/dev/example-app/_includes/steps/50_error_handling.md -->
<!-- endsource: ru/dev/example-app/_includes/index.md -->

