diff options
author | alexv-smirnov <alex@ydb.tech> | 2023-04-25 11:35:09 +0300 |
---|---|---|
committer | alexv-smirnov <alex@ydb.tech> | 2023-04-25 11:35:09 +0300 |
commit | 79d61286efe6199726d310ceca583741a0c21caf (patch) | |
tree | 2adb78bf7c56dd9f304614ccb5d0b8aaf18e427a | |
parent | 0fbef0f9c08b91f3238020e5d13c6ad2c232e814 (diff) | |
download | ydb-79d61286efe6199726d310ceca583741a0c21caf.tar.gz |
extended article on yql cli pars
- Добавлены примеры и расширено описание основных параметров команд исполнения YQL-запросов
- В статьях о командах оставлена только справочная информация об опциях параметризации, подробное последовательное описание с примерами перенесено в отдельную статью
- Поправлены недоделки после переименования профиля для тестов по-умолчанию из db1 в quickstart в рамках https://a.yandex-team.ru/review/3736675/details
13 files changed, 487 insertions, 128 deletions
diff --git a/ydb/docs/ru/core/_includes/parameterized-query.md b/ydb/docs/ru/core/_includes/parameterized-query.md index 124aacd6f0..fcc3da13b2 100644 --- a/ydb/docs/ru/core/_includes/parameterized-query.md +++ b/ydb/docs/ru/core/_includes/parameterized-query.md @@ -1,14 +1,12 @@ -{{ ydb-short-name }} CLI автоматически определяет что `stdin` не связан с терминалом ввода. Использование `stdin` позволяет передавать на вход содержимое файлов операторами `>`/`<` или перенаправить вывод другой команды оператором `\|`. По умолчанию переданный контент интерпретируется так же, как и файл в `--param-file` (документ JSON). Передача через `stdin` позволяет воспользоваться дополнительными возможностями с помощью параметров `--stdin-format`, `--stdin-par`, и `--batch`. - -Следующие параметры могут быть использованы с любой из команд выполнения YQL-запросов {{ ydb-short-name }} CLI. Примеры смотрите в [{#T}](../reference/ydb-cli/parameterized-queries-cli.md). +Ниже приведена краткая справка, расширенное описание с примерами смотрите в статье [{#T}](../reference/ydb-cli/parameterized-queries-cli.md). Имя | Описание ---|--- -`-p, --param` | Выражение в формате `$name=value`, где `$name` — имя параметра YQL-запроса, а `value` — его значение (корректный [JSON value](https://www.json.org/json-ru.html)). Может быть указано несколько раз.<br><br>Все указываемые параметры должны быть декларированы в YQL-запросе [оператором DECLARE](../yql/reference/syntax/declare.md), иначе будет выдана ошибка «Query does not contain parameter». Если один и тот же параметр указан несколько раз, будет выдана ошибка «Parameter value found in more than one source».<br><br>В зависимости от используемой операционной системы может понадобиться экранирование символа `$` или запись выражения в одинарных кавычках `'`. -`--param-file` | Имя файла в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %} в кодировке [UTF-8]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/UTF-8){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/UTF-8){% endif %}, в котором заданы значения параметров, сопоставляемые с параметрами YQL-запроса по именам ключей. Может быть указано несколько раз.<br><br>Если значения декларированного в YQL-запросе параметра будут обнаружены одновременно в нескольких файлах, или заданы в командной строке опцией `--param`, будет выдана ошибка «Parameter value found in more than one source».<br><br>Имена ключей в JSON-файле указываются без начального символа `$`. Ключи, которые присутствуют в файле, но не декларированы в YQL-запросе, будут проигнорированы без выдачи сообщения об ошибке. -`--input-format` | Формат представления значений параметров. Действует на все способы их передачи (через параметр команды, файл или `stdin`).<br>Возможные значения:<ul><li>`json-unicode` (по умолчанию) — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}. Такая возможность позволяет передавать любые бинарные данные, декодирование которых из Base64 выполнит {{ ydb-short-name }} CLI.</li></ul> -`--stdin-format` | Задает формат представления параметров и фрейминг для `stdin`. Чтобы задать оба значения, укажите параметр дважды.<br>**Формат представления параметров на `stdin`**<br>Возможные значения:<ul><li>`json-unicode` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}. Такая возможность позволяет передавать любые бинарные данные, декодирование которых из Base64 выполнит {{ ydb-short-name }} CLI.</li><li>`raw` - бинарные данные, представляющие значение параметра, имя которого задается параметром `--stdin-par`.</li></ul>Если формат представления параметров на `stdin` не задан, то применяется формат, заданный параметром `--input-format`.<br><br>**Разделение наборов параметров (фрейминг) для `stdin`**<br>Возможные значения:<ul><li>`no-framing` (по умолчанию) — `stdin` не используется, либо на `stdin` ожидается один набор параметров, YQL-запрос исполняется однократно после завершения чтения `stdin`.</li><li>`newline-delimited` — символ перевода строки отмечает на `stdin` окончание одного набора параметров, отделяя его от следующего. Момент отправки YQL-запроса на сервер определяется параметром `--batch`.</li></ul> -`--stdin-par` | Имя параметра, значение которого будет передано через `stdin`. Указывается без символа `$`. Обязательно при использовании формата `raw` в `--stdin-format`.<br><br>При использовании с JSON-форматами команда ожидает на входе только значение в корректном для JSON представлении. При включенном фрейминге может быть указано несколько разных имен, в этом случае подстановка будет осуществляться с чередованием имен параметров. -`--batch` | Режим пакетирования значений наборов параметров, получаемых через `stdin`.<br>Возможные значения:<ul><li>`iterative` (по умолчанию) — пакетирование выключено. YQL-запрос исполняется для каждого полученного набора параметров, то есть ровно один раз при выключенном фрейминге или отсутствии активного `stdin`. При включенном фрейминге очередной YQL-запрос уходит на исполнение при получении разделителя наборов параметров на `stdin`, а исполнение команды завершается при закрытии потока на `stdin`.</li><li>`full` - полный пакет. YQL-запрос исполняется один раз после закрытия потока на `stdin`, все полученные наборы параметров заворачиваются в `List<>`, имя параметра задается опцией `--stdin-par`.</li><li>`adaptive` - адаптивное пакетирование. YQL-запрос исполняется каждый раз, когда срабатывает ограничение на количество наборов параметров в одном запросе (`--batch-limit`) или на задержку обработки (`--batch-max-delay`). Все полученные к этому моменту наборы параметров заворачиваются в `List<>`, имя параметра задается опцией `--stdin-par`. -`--batch-limit` | Максимальное количество наборов параметров в пакете для адаптивного режима пакетирования. Следующий пакет будет отправлен на исполнение YQL-запросом, если количество наборов данных в нем достигло указанного значения. Установка в `0` снимает ограничение.<br><br>Значение по умолчанию — `1000`.<br><br>Параметры передаются в YQL без стриминга и общий объем одного GRPC-запроса, в который включаются значения параметров, имеет верхнюю границу около 5 МБ. -`--batch-max-delay` | Максимальная задержка отправки на обработку полученного набора параметров для адаптивного режима пакетирования. Задается в виде числа с размерностью времени - `s`, `ms`, `m`.<br><br>Значение по умолчанию — `1s` (1 секунда).<br><br>{{ ydb-short-name }} CLI будет отсчитывать время с момента получения первого набора параметров для пакета и отправит накопившийся пакет на исполнение, как только время превысит указанное значение. Параметр позволяет получить эффективное пакетирование в случае непредсказуемого темпа появления новых наборов параметров на `stdin`. +`-p, --param` | Значение одного параметра YQL-запроса в формате `$name=value`, где `$name` — имя параметра, а `value` — его значение (корректный [JSON value](https://www.json.org/json-ru.html)). +`--param-file` | Имя файла в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %} в кодировке [UTF-8]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/UTF-8){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/UTF-8){% endif %}, в котором заданы значения параметров, сопоставляемые с параметрами YQL-запроса по именам ключей. +`--input-format` | Формат представления значений параметров. Действует на все способы их передачи (через параметр команды, файл или `stdin`).<br>Возможные значения:<ul><li>`json-unicode` (по умолчанию) — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}.</li></ul> +`--stdin-format` | Формат представления параметров и фрейминг для `stdin`. Чтобы задать оба значения, укажите параметр дважды.<br>**Формат представления параметров на `stdin`**<br>Возможные значения:<ul><li>`json-unicode` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}.</li><li>`raw` - бинарные данные, имя параметра задается опцией `--stdin-par`.</li></ul>Если формат представления параметров на `stdin` не задан, то применяется формат, заданный параметром `--input-format`.<br><br>**Разделение наборов параметров (фрейминг) для `stdin`**<br>Возможные значения:<ul><li>`no-framing` (по умолчанию) — фрейминг не применяется</li><li>`newline-delimited` — символ перевода строки отмечает на `stdin` окончание одного набора параметров, отделяя его от следующего.</li></ul> +`--stdin-par` | Имя параметра, значение которого будет передано через `stdin`, указывается без символа `$`. +`--batch` | Режим пакетирования значений наборов параметров, получаемых через `stdin`.<br>Возможные значения:<ul><li>`iterative` (по умолчанию) — пакетирование выключено</li><li>`full` - полный пакет</li><li>`adaptive` - адаптивное пакетирование +`--batch-limit` | Максимальное количество наборов параметров в пакете для адаптивного режима пакетирования. Установка в `0` снимает ограничение.<br><br>Значение по умолчанию — `1000`.<br><br> +`--batch-max-delay` | Максимальная задержка отправки на обработку полученного набора параметров для адаптивного режима пакетирования. Задается в виде числа с размерностью времени - `s`, `ms`, `m`.<br><br>Значение по умолчанию — `1s` (1 секунда).<br><br> diff --git a/ydb/docs/ru/core/_includes/ydb-cli-profile.md b/ydb/docs/ru/core/_includes/ydb-cli-profile.md index ceed0131d4..ac0dbed17c 100644 --- a/ydb/docs/ru/core/_includes/ydb-cli-profile.md +++ b/ydb/docs/ru/core/_includes/ydb-cli-profile.md @@ -1,5 +1,5 @@ {% note info %} -В примерах используется профиль `quickstart`, подробнее смотрите в [{#T}](../reference/ydb-cli/profile/_includes/create.md#quickstart). +В примерах используется профиль `quickstart`, подробнее смотрите в [{#T}](../reference/ydb-cli/profile/create.md#quickstart). {% endnote %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-list.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-list.md index 3542a0a22a..816455988c 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-list.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-list.md @@ -18,7 +18,7 @@ ## Пример ``` bash -$ ydb --profile db1 discovery list +$ ydb -p quickstart discovery list grpcs://vm-etn01q5-ysor.etn01q5k.ydb.mdb.yandexcloud.net:2135 [sas] #table_service #scripting #discovery #rate_limiter #locking #kesus grpcs://vm-etn01q5-arum.etn01ftr.ydb.mdb.yandexcloud.net:2135 [vla] #table_service #scripting #discovery #rate_limiter #locking #kesus grpcs://vm-etn01q5beftr.ydb.mdb.yandexcloud.net:2135 [myt] #table_service #scripting #discovery #rate_limiter #locking #kesus diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-whoami.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-whoami.md index 3ea4f59c9e..25f1f6d337 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-whoami.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/discovery-whoami.md @@ -17,7 +17,7 @@ ## Пример ``` bash -$ ydb --profile db1 discovery whoami -g +$ ydb -p quickstart discovery whoami -g User SID: aje5kkjdgs0puc18976co@as User has no groups diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md index 0adac7bff0..5793ab8a1e 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md @@ -124,10 +124,10 @@ **Пример** -{% include [example_db1.md](../../../../_includes/ydb-cli-profile.md) %} +{% include [ydb-cli-profile.md](../../../../_includes/ydb-cli-profile.md) %} Переименование индекса `idx_aired` с таблицы episodes, построенного в примере создания индекса выше: ```bash -{{ ydb-cli }} -p db1 table index rename episodes --index-name idx_aired --to idx_aired_renamed +{{ ydb-cli }} -p quickstart table index rename episodes --index-name idx_aired --to idx_aired_renamed ``` diff --git a/ydb/docs/ru/core/reference/ydb-cli/parameterized-queries-cli.md b/ydb/docs/ru/core/reference/ydb-cli/parameterized-queries-cli.md index 974250a553..2d7b364783 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/parameterized-queries-cli.md +++ b/ydb/docs/ru/core/reference/ydb-cli/parameterized-queries-cli.md @@ -1,112 +1,333 @@ -# Передача параметров в команды выполнения YQL-запросов +# Выполнение параметризованных YQL-запросов и скриптов -{{ ydb-short-name }} поддерживает и рекомендует к использованию [параметризованные запросы](https://en.wikipedia.org/wiki/Prepared_statement). Для выполнения параметризованных YQL-запросов вы можете использовать команды {{ ydb-short-name }} CLI: +## Обзор + +{{ ydb-short-name }} CLI поддерживает исполнение [параметризованных YQL-запросов](https://en.wikipedia.org/wiki/Prepared_statement). Для работы с параметрами в тексте YQL-запроса должны присутствовать их определения [командой YQL `DECLARE`](../../yql/reference/syntax/declare.md). + +Для выполнения параметризованных YQL-запросов вы можете использовать команды {{ ydb-short-name }} CLI: * [ydb yql](yql.md); * [ydb scripting yql](scripting-yql.md); * [ydb table query execute](table-query-execute.md). -Команды поддерживают одинаковый синтаксис и возможности передачи параметров запросов. Значения параметров могут быть заданы в командной строке, загружены из файлов в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, а также считаны с `stdin` в бинарном формате или в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}. При передаче параметров через `stdin` поддерживается многократное поточное исполнение YQL-запроса с разными значениями параметров и возможностью пакетирования. +Данные команды поддерживают одинаковый синтаксис и возможности передачи параметров запросов. Значения параметров могут быть заданы в командной строке, загружены из файлов в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, а также считаны с `stdin` в бинарном формате или в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}. При передаче параметров через `stdin` поддерживается многократное поточное исполнение YQL-запроса с разными значениями параметров и возможностью пакетирования. + +{% note warning %} + +Из всех команд исполнения YQL-запросов только команда `table query execute` применяет политики повторных попыток, обеспечивающие надежное исполнение запросов и продолжение работы при изменении набора партиций в таблицах, а также других стандартных ситауциях в распределенной базе данных, вызывающих кратковременную невозможность выполнения операций над частью данных. + +{% endnote %} + +## Единичное исполнение YQL-запроса {#one-request} + +Параметры для исполнения YQL-запроса могут быть переданы из командной строки, JSON-файлов, и `stdin`, для чего в командах {{ ydb-short-name }} CLI предназначены следующие параметры: -Для работы с параметрами в YQL-запросе должны присутствовать их определения [командой YQL `DECLARE`](../../yql/reference/syntax/declare.md). +Имя | Описание +---|--- +`-p, --param` | Выражение в формате `$name=value`, где `$name` — имя параметра YQL-запроса, а `value` — его значение (корректный [JSON value](https://www.json.org/json-ru.html)). Может быть указано несколько раз.<br><br>Все указываемые параметры должны быть декларированы в YQL-запросе [оператором DECLARE](../../yql/reference/syntax/declare.md), иначе будет выдана ошибка «Query does not contain parameter». Если один и тот же параметр указан несколько раз, будет выдана ошибка «Parameter value found in more than one source».<br><br>В зависимости от используемой операционной системы может понадобиться экранирование символа `$` или запись выражения в одинарных кавычках `'`. +`--param-file` | Имя файла в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %} в кодировке [UTF-8]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/UTF-8){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/UTF-8){% endif %}, в котором заданы значения параметров, сопоставляемые с параметрами YQL-запроса по именам ключей. Может быть указано несколько раз.<br><br>Если значения декларированного в YQL-запросе параметра будут обнаружены одновременно в нескольких файлах, или заданы в командной строке опцией `--param`, будет выдана ошибка «Parameter value found in more than one source».<br><br>Имена ключей в JSON-файле указываются без начального символа `$`. Ключи, которые присутствуют в файле, но не декларированы в YQL-запросе, будут проигнорированы без выдачи сообщения об ошибке. +`--input-format` | Формат представления значений параметров. Действует на все способы их передачи (через параметр команды, файл или `stdin`).<br>Возможные значения:<ul><li>`json-unicode` (по умолчанию) — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}. Такая возможность позволяет передавать бинарные данные, декодирование которых из Base64 выполнит {{ ydb-short-name }} CLI.</li></ul> +`--stdin-format` | Формат представления значений параметров на `stdin`.<br>{{ ydb-short-name }} CLI автоматически определяет что на стандартное устройство ввода `stdin` перенаправлен файл или выход другой команды командной оболочки, и в этом случае интерпретирует полученные данные в соответствии с возможными значениями:<ul><li>`json-unicode` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}.</li><li>`json-base64` — [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, в котором значения параметров с типом «бинарная строка» (`DECLARE $par AS String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}.</li><li>`raw` - бинарные данные.</li></ul>Если формат представления параметров на `stdin` не задан, то применяется формат, заданный параметром `--input-format`. +`--stdin-par` | Имя параметра, значение которого передано через `stdin`. Указывается без символа `$`. Обязательно при использовании формата `raw` в `--stdin-format`.<br><br>При использовании с JSON-форматами `stdin` интерпретируется не как JSON-документ, а как JSON value, с передачей значения в параметр с указанным именем. -В примерах используется команда `table query execute`, они также выполняются для любой команды исполнения YQL-скрипта. +Запрос будет отправлен на исполнение на сервер один раз, если значения заданы для всех параметров [в секции `DECLARE`](../../yql/reference/syntax/declare.md). Если хотя бы для одного параметра значение не задано, запрос не будет выполнен с выдачей сообщения об ошибке "Missing value for parameter". + +### Примеры {#examples-one-request} + +В примерах используется команда `table query execute`, но они также могут быть выполнены командами `yql` и `scripting yql`. {% include [ydb-cli-profile](../../_includes/ydb-cli-profile.md) %} -## Простой параметризованный запрос {#example-simple} +#### Передача значения одного параметра {#example-simple} -Передача значения параметра `a` через `--param`: +В командной строке: ```bash -{{ ydb-cli }} -p db1 table query execute -q 'declare $a as Int64;select $a' --param '$a=10' +{{ ydb-cli }} -p quickstart table query execute -q 'declare $a as Int64;select $a' --param '$a=10' ``` -Передача значения параметра `a` в JSON-формате через `stdin`: +Через файл: ```bash -echo '{"a":10}' | {{ ydb-cli }} -p db1 table query execute -q 'declare $a as Int64;select $a' +echo '{"a":10}' > p1.json +{{ ydb-cli }} -p quickstart table query execute -q 'declare $a as Int64;select $a' --param-file p1.json ``` -Передача значения параметра `a` в JSON-формате через файл `p1.json`: +Через `stdin`: ```bash -echo '{"a":10}' > p1.json -{{ ydb-cli }} -p db1 table query execute -q 'declare $a as Int64;select $a' --param-file p1.json +echo '{"a":10}' | {{ ydb-cli }} -p quickstart table query execute -q 'declare $a as Int64;select $a' +``` + +```bash +echo '10' | {{ ydb-cli }} -p quickstart table query execute -q 'declare $a as Int64;select $a' --stdin-par a ``` -## Передача значений параметров разных типов из нескольких источников {#example-multisource} +#### Передача значений параметров разных типов из нескольких источников {#example-multisource} ```bash echo '{ "a":10, "b":"Some text", "x":"Ignore me" }' > p1.json -echo '{ "c":"2012-04-23T18:25:43.511Z" }' | {{ ydb-cli }} -p db1 table query execute \ - -q 'declare $a as Int64;declare $b as Utf8;declare $c as DateTime;declare $d as Int64; +echo '{ "c":"2012-04-23T18:25:43.511Z" }' | {{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $a as Int64; + declare $b as Utf8; + declare $c as DateTime; + declare $d as Int64; + select $a, $b, $c, $d' \ --param-file p1.json \ --param '$d=30' ``` -## Передача бинарных строк в кодировке Base64 {#example-base64} +Вывод команды: + +```text +┌─────────┬─────────────┬────────────────────────┬─────────┐ +| column0 | column1 | column2 | column3 | +├─────────┼─────────────┼────────────────────────┼─────────┤ +| 10 | "Some text" | "2012-04-23T18:25:43Z" | 30 | +└─────────┴─────────────┴────────────────────────┴─────────┘ +``` + +#### Передача бинарных строк в кодировке Base64 {#example-base64} ```bash -{{ ydb-cli }} -p db1 table query execute \ - -q 'declare $a as String;select $a' \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $a as String; + select $a' \ --input-format json-base64 \ --param '$a="SGVsbG8sIHdvcmxkCg=="' ``` -## Передача бинарного контента в поле типа «бинарная строка» {#example-raw} +Вывод команды: + +```text +┌──────────────────┐ +| column0 | +├──────────────────┤ +| "Hello, world\n" | +└──────────────────┘ +``` + +#### Прямая передача бинарного контента {#example-raw} ```bash -curl -L http://ydb.tech/docs | {{ ydb-cli }} -p db1 table query execute \ - -q 'declare $a as String;select LEN($a)' \ +curl -Ls http://ydb.tech/docs | {{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $a as String; + select LEN($a)' \ --stdin-format raw \ --stdin-par a ``` -## Итеративная обработка нескольких наборов параметров {#example-iterate} +Вывод команды (точное количество байт может отличаться): + +```text +┌─────────┐ +| column0 | +├─────────┤ +| 66426 | +└─────────┘ +``` + +## Итеративная потоковая обработка {#streaming-iterate} + +{{ ydb-short-name }} CLI поддерживает возможность многократного исполнения YQL-запроса с разными наборами значений параметров, при их передаче через `stdin`. При этом соединение с базой данных устанавливается однократно, а план исполнения запроса кешируется, что существенно повышает производительность такого подхода по сравнению с отдельными вызовами CLI. + +Для того чтобы воспользоваться этой возможностью, необходимо на `stdin` друг за другом передавать разные наборы значений одних и тех параметров, сообщив {{ ydb-short-name }} CLI правило, по которому будет возможно отделить эти наборы друг от друга. + +YQL-запрос выполняется столько раз, сколько наборов значений параметров получено через `stdin`. Каждый полученный на `stdin` набор объядиняется со значениями параметров, определенными через другие источники (`--param`, `--param-file`). Исполнение команды будет завершено после завершения потока на `stdin`. Каждый запрос исполняется в своей транзакции. + +Правило отделения наборов параметров друг от друга (фрейминг) дополняет описание формата представления параметров на `stdin`, задаваемое параметром `--stdin-format`: + +Имя | Описание +---|--- +`--stdin-format` | Задает фрейминг для `stdin`. <br>Возможные значения:<ul><li>`no-framing` (по умолчанию) — на `stdin` ожидается один набор параметров, YQL-запрос исполняется однократно после завершения чтения `stdin`.</li><li>`newline-delimited` — символ перевода строки отмечает на `stdin` окончание одного набора параметров, отделяя его от следующего. YQL-запрос исполняется каждый раз при получении на `stdin` символа перевода строки.</li></ul> + +{% note warning %} + +При использовании символа перевода строки в качестве разделителя наборов параметров необходимо гарантировать его отсутствие внутри наборов параметров. Заключение текста в кавычки не делает допустимым перевод строки внутри такого текста. Многострочные JSON-документы не допускаются. + +{% endnote %} + +### Пример {#example-streaming-iterate} + +#### Потоковая обработка нескольких наборов параметров {#example-iterate} + +Допустим, нам необходимо выполнить запрос трижды, со следующими наборами значений параметров `a` и `b`: + +1. `a` = 10, `b` = 20 +2. `a` = 15, `b` = 25 +3. `a` = 35, `b` = 48 + +Создадим файл, который будет содержать строки с JSON-представлением этих наборов: + +```bash +echo -e '{"a":10,"b":20}\n{"a":15,"b":25}\n{"a":35,"b":48}' > par1.txt +cat par1.txt +``` + +Вывод команды: + +```text +{"a":10,"b":20} +{"a":15,"b":25} +{"a":35,"b":48} +``` + +Исполним запрос, передав на `stdin` содержимое данного файла, с форматированием вывода в JSON: ```bash -echo -e '{"a":10,"b":20}\n{"a":15,"b":25}\n{"a":35,"b":48}' > p1.json -cat p1.json | {{ ydb-cli }} -p db1 table query execute \ - -q 'declare $a as Int64;declare $b as Int64;select $a+$b' \ - --stdin-format newline-delimited +cat par1.txt | \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $a as Int64; + declare $b as Int64; + select $a+$b' \ + --stdin-format newline-delimited \ + --format json-unicode ``` -## Полная пакетная обработка {#example-full} +Вывод команды: -В данном примере использован вариант передачи именованных параметров в список структур, применимый для полного и адаптивного режимов пакетирования. +```text +{"column0":30} +{"column0":40} +{"column0":83} +``` + +Полученный в таком формате результат можно использовать для передачи на вход команде исполнения следующего YQL-запроса. + +#### Потоковая обработка с объединением значений параметров из разных источников {#example-iterate-union} + +Допустим, нам необходимо выполнить запрос трижды, со следующими наборами значений параметров `a` и `b`: + +1. `a` = 10, `b` = 100 +2. `a` = 15, `b` = 100 +3. `a` = 35, `b` = 100 + +```bash +echo -e '10\n15\n35' | \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $a as Int64; + declare $b as Int64; + select $a+$b as sum1' \ + --param '$b=100' \ + --stdin-format newline-delimited \ + --stdin-par a \ + --format json-unicode +``` + +Вывод команды: + +```text +{"sum1":110} +{"sum1":115} +{"sum1":135} +``` + +## Пакетная потоковая обработка {#streaming-batch} + +{{ ydb-short-name }} CLI поддерживает автоматическую конвертацию наборов параметров в `List<>`, позволяя одним запросом к серверу обработать множество наборов параметров в одной транзакции, что может дополнительно существенно повышать производительность по сравнению с выполнением запросов "по одному". + +Поддерживаются два режима пакетирования: + +- Полный +- Адаптивный + +### Полный режим пакетирования {#batch-full} + +Полный (`full`) режим является упрощенным вариантом пакетирования, когда запрос выполняется один раз, с заворачиванием в `List<>` всех полученных на `stdin` наборов параметров. Если размер запроса окажется слишком большим, будет выдана ошибка. + +Данный вариант пакетирования необходим в случае, когда необходимо гарантировать атомарность за счет применения всех параметров в одной транзакции. + +### Адаптивный режим пакетирования {#batch-adaptive} + +При работе в адаптивном (`adaptive`) режиме обработка входного потока разбивается на множество транзакций, с автоматическим подбором размера пакета для каждой из них. + +Данный режим позволяет эффективно обрабатывать широкий спектр входной нагрузки, с непредсказуемым или бесконечным количеством данных, а также непредсказуемым или сильно меняющимся темпом их появления на входе. В частности, такой профиль характерен при подаче на `stdin` выхода другой команды через оператор `|`. + +Адаптивный режим решает две основных проблемы обработки динамического потока: + +1. Ограничение максимального размера пакета. +2. Ограничение максимальной задержки обработки данных. + +### Синтаксис {#batch-syntax} + +Для того чтобы воспользоваться возможностью пакетирования, необходимо описать параметр типа `List<...>` или `List<Struct<...>>` в секции DECLARE YQL-запроса, и выбрать режим следующим параметром: + +Имя | Описание +---|--- +`--batch` | Режим пакетирования значений наборов параметров, получаемых через `stdin`.<br>Возможные значения:<ul><li>`iterative` (по умолчанию) — пакетирование [выключено](#streaming-iterate).</li><li>`full` - полный пакет. YQL-запрос исполняется один раз после завершения `stdin`, все полученные наборы параметров заворачиваются в `List<>`, имя параметра задается опцией `--stdin-par`.</li><li>`adaptive` - адаптивное пакетирование. YQL-запрос исполняется каждый раз, когда срабатывает ограничение на количество наборов параметров в одном запросе (`--batch-limit`) или на задержку обработки (`--batch-max-delay`). Все полученные к этому моменту наборы параметров заворачиваются в `List<>`, имя параметра задается опцией `--stdin-par`. + +В адаптивном режиме пакетирования доступны дополнительные параметры: + +Имя | Описание +---|--- +`--batch-limit` | Максимальное количество наборов параметров в пакете для адаптивного режима пакетирования. Следующий пакет будет отправлен на исполнение YQL-запросом, если количество наборов данных в нем достигло указанного значения. Установка в `0` снимает ограничение.<br><br>Значение по умолчанию — `1000`.<br><br>Параметры передаются в YQL без стриминга и общий объем одного GRPC-запроса, в который включаются значения параметров, имеет верхнюю границу около 5 МБ. +`--batch-max-delay` | Максимальная задержка отправки на обработку полученного набора параметров для адаптивного режима пакетирования. Задается в виде числа с размерностью времени - `s`, `ms`, `m`.<br><br>Значение по умолчанию — `1s` (1 секунда).<br><br>{{ ydb-short-name }} CLI будет отсчитывать время с момента получения первого набора параметров для пакета и отправит накопившийся пакет на исполнение, как только время превысит указанное значение. Параметр позволяет получить эффективное пакетирование в случае непредсказуемого темпа появления новых наборов параметров на `stdin`. + +### Примеры - полная пакетная обработка {#example-batch-full} ```bash echo -e '{"a":10,"b":20}\n{"a":15,"b":25}\n{"a":35,"b":48}' | \ -{{ ydb-cli }} -p db1 table query execute \ - -q 'declare $x as List<Struct<a:Int64,b:Int64>>;select ListLength($x), $x' \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $x as List<Struct<a:Int64,b:Int64>>; + select ListLength($x), $x' \ --stdin-format newline-delimited \ --stdin-par x \ --batch full ``` -## Адаптивная пакетная обработка {#example-adaptive} - -### Триггер по задержке обработки {#example-adaptive-delay} +Вывод команды: +```text +┌─────────┬───────────────────────────────────────────────────┐ +| column0 | column1 | +├─────────┼───────────────────────────────────────────────────┤ +| 3 | [{"a":10,"b":20},{"a":15,"b":25},{"a":35,"b":48}] | +└─────────┴───────────────────────────────────────────────────┘ +``` -Для демонстрации работы адаптивного пакетирования со срабатыванием триггера по задержке обработки в первой строке команды ниже производится генерация 1000 строк с задержкой в 0.2 секунды. Команда будет отображать пакеты параметров в каждом следующем вызове YQL-запроса. +### Примеры - адаптивная пакетная обработка {#example-batch-adaptive} -В данном примере использован вариант передачи параметров без имени в типизированный список, применимый для полного и адаптивного режимов пакетирования. +#### Ограничение максимальной задержки обработки {#example-adaptive-delay} -Значение `--batch-max-delay` по умолчанию установлено в 1 секунду, поэтому в каждый запрос будет попадать около 5 строк. При этом в первый пакет пойдут все строки, накопившиеся за время открытия соединения с БД, и он будет больше чем последующие. +Для демонстрации работы адаптивного пакетирования со срабатыванием ограничения по задержке обработки в первой строке команды ниже производится генерация 1000 строк с задержкой в 0.2 секунды в `stdout`, которые передаются на `stdin` команде исполнения YQL-запроса. Команда исполнения YQL-запроса, в свою очередь, отображает пакеты параметров в каждом следующем вызове YQL-запроса. ```bash for i in $(seq 1 1000);do echo "Line$i";sleep 0.2;done | \ -{{ ydb-cli }} -p db1 table query execute \ - -q 'declare $x as List<Utf8>;select ListLength($x), $x' \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $x as List<Utf8>; + select ListLength($x), $x' \ --stdin-format newline-delimited \ --stdin-format raw \ --stdin-par x \ --batch adaptive ``` -### Триггер по количеству записей {#example-adaptive-limit} +Вывод команды (точные значения могут отличаться): + +``` +┌─────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +| column0 | column1 | +├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +| 14 | ["Line1","Line2","Line3","Line4","Line5","Line6","Line7","Line8","Line9","Line10","Line11","Line12","Line13","Line14"] | +└─────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌─────────┬─────────────────────────────────────────────────────────┐ +| column0 | column1 | +├─────────┼─────────────────────────────────────────────────────────┤ +| 6 | ["Line15","Line16","Line17","Line18","Line19","Line20"] | +└─────────┴─────────────────────────────────────────────────────────┘ +┌─────────┬─────────────────────────────────────────────────────────┐ +| column0 | column1 | +├─────────┼─────────────────────────────────────────────────────────┤ +| 6 | ["Line21","Line22","Line23","Line24","Line25","Line26"] | +└─────────┴─────────────────────────────────────────────────────────┘ +^C +``` + +В первый пакет попадают все строки, накопившиеся на входе за время открытия соединения с БД, и поэтому он больше чем последующие. + +Выполнение команды можно прервать по Ctrl+C, или дождаться пока пройдут 200 секунд, в течение которых генерируется вход. + +#### Ограничение по количеству записей {#example-adaptive-limit} Для демонстрации работы адаптивного пакетирования со срабатыванием триггера по количеству наборов параметров в первой строке команды ниже производится генерация 200 строк. Команда будет отображать пакеты параметров в каждом следующем вызове YQL-запроса, учитывая заданное ограничение `--batch-limit` равное 20 (по умолчанию 1000). @@ -114,8 +335,9 @@ for i in $(seq 1 1000);do echo "Line$i";sleep 0.2;done | \ ```bash for i in $(seq 1 200);do echo "Line$i";done | \ -{{ ydb-cli }} -p db1 table query execute \ - -q 'declare $x as List<Utf8>;declare $p2 as Int64; +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $x as List<Utf8>; + declare $p2 as Int64; select ListLength($x) as count, $p2 as p2, $x as items' \ --stdin-format newline-delimited \ --stdin-format raw \ @@ -126,9 +348,51 @@ for i in $(seq 1 200);do echo "Line$i";done | \ --format json-unicode ``` -## Конвейерная обработка сообщений, считываемых из топика {#example-adaptive-pipeline-from-topic} +Вывод команды: + +```text +{"count":20,"p2":10,"items":["Line1","Line2","Line3","Line4","Line5","Line6","Line7","Line8","Line9","Line10","Line11","Line12","Line13","Line14","Line15","Line16","Line17","Line18","Line19","Line20"]} +{"count":20,"p2":10,"items":["Line21","Line22","Line23","Line24","Line25","Line26","Line27","Line28","Line29","Line30","Line31","Line32","Line33","Line34","Line35","Line36","Line37","Line38","Line39","Line40"]} +... +{"count":20,"p2":10,"items":["Line161","Line162","Line163","Line164","Line165","Line166","Line167","Line168","Line169","Line170","Line171","Line172","Line173","Line174","Line175","Line176","Line177","Line178","Line179","Line180"]} +{"count":20,"p2":10,"items":["Line181","Line182","Line183","Line184","Line185","Line186","Line187","Line188","Line189","Line190","Line191","Line192","Line193","Line194","Line195","Line196","Line197","Line198","Line199","Line200"]} +``` + +#### Удаление множества записей из таблицы YDB по первичным ключам {#example-adaptive-delete-pk} + +Данный пример показывает как можно удалять неограниченное количество записей из таблиц YDB, не рискуя превысить ограничения на количество записей в транзакции. + +Создадим тестовую таблицу: + +```bash +{{ ydb-cli }} -p quickstart yql -s 'create table test_delete_1( id UInt64 not null, primary key (id))' +``` + +Занесем в неё 100000 записей: + +```bash +for i in $(seq 1 100000);do echo "$i";done | \ +{{ ydb-cli }} -p quickstart import file csv -p test_delete_1 +``` + +Удалим все записи с ID > 10: + +```bash +{{ ydb-cli }} -p quickstart table query execute -t scan \ + -q 'select t.id from test_delete_1 as t where t.id > 10' \ + --format json-unicode | \ +{{ ydb-cli }} -p quickstart table query execute \ + -q 'declare $lines as List<Struct<id:UInt64>>; + delete from test_delete_1 where id in (select tl.id from AS_TABLE($lines) as tl)' \ + --stdin-format newline-delimited \ + --stdin-par lines \ + --batch adaptive \ + --batch-limit 10000 +``` + +#### Обработка сообщений, считываемых из топика {#example-adaptive-pipeline-from-topic} -О конвейерной обработке сообщений, считываемых из топика, читайте в статье [{#T}](topic-pipeline.md#example-read-to-yql-param). +Примеры обработки сообщений, считываемых из топика, приведены в статье [{#T}](topic-pipeline.md#example-read-to-yql-param). ## См. также {#see-also} diff --git a/ydb/docs/ru/core/reference/ydb-cli/scripting-yql.md b/ydb/docs/ru/core/reference/ydb-cli/scripting-yql.md index e1b468a70a..7186d45108 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/scripting-yql.md +++ b/ydb/docs/ru/core/reference/ydb-cli/scripting-yql.md @@ -29,7 +29,7 @@ ydb scripting yql --help `--show-response-metadata` | Показать метаданные ответа. `--format` | Формат вывода.<br>Значение по умолчанию — `pretty`.<br>Возможные значения:<ul><li>`pretty` — человекочитаемый формат;</li><li>`json-unicode` — вывод в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, бинарные строки закодированы в [Юникод]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Юникод){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Unicode){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-unicode-array` — вывод в формате JSON, бинарные строки закодированы в Юникод, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64` — вывод в формате JSON, бинарные строки закодированы в [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64-array` — вывод в формате JSON, бинарные строки закодированы в Base64, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке.</li></ul> -### Параметры для работы с параметризованными запросами {#parameterized-query} +### Работа с параметризованными запросами {#parameterized-query} {% include [parameterized-query](../../_includes/parameterized-query.md) %} @@ -37,21 +37,39 @@ ydb scripting yql --help {% include [ydb-cli-profile](../../_includes/ydb-cli-profile.md) %} -### Выполнение запроса с таймаутом {#example-timeout} +Скрипт создания таблицы, заполнения её данными, и получения выборки из этой таблицы: -Выполните запрос с таймаутом 500 мс: +```bash +{{ ydb-cli }} -p quickstart scripting yql -s ' + CREATE TABLE series (series_id Uint64, title Utf8, series_info Utf8, release_date Date, PRIMARY KEY (series_id)); + COMMIT; + UPSERT INTO series (series_id, title, series_info, release_date) values (1, "Title1", "Info1", Cast("2023-04-20" as Date)); + COMMIT; + SELECT * from series; + ' +``` + +Вывод команды: + +```text +┌──────────────┬───────────┬─────────────┬──────────┐ +| release_date | series_id | series_info | title | +├──────────────┼───────────┼─────────────┼──────────┤ +| "2023-04-20" | 1 | "Info1" | "Title1" | +└──────────────┴───────────┴─────────────┴──────────┘ +``` + +Выполнение скрипта из примера выше, записанного в файле `script1.yql`, с выводом результатов в формате `JSON`: ```bash -ydb yql \ - --script \ - "CREATE TABLE series ( \ - series_id Uint64, \ - title Utf8, \ - series_info Utf8, \ - release_date Uint64, \ - PRIMARY KEY (series_id) \ - );" \ - --timeout 500 +{{ ydb-cli }} -p quickstart scripting yql -f script1.yql --format json-unicode ``` -Если сервер не успеет выполнить запрос за 500 мс, он ответит ошибкой. Если по какой либо причине клиент не сможет получить сообщение сервера об ошибке, то операция будет прервана через 500+200 мс на стороне клиента. +Вывод команды: + +```text +{"release_date":"2023-04-20","series_id":1,"series_info":"Info1","title":"Title1"} +``` + +Примеры передачи параметров в скрипты приведены в [статье о передаче параметров в команды исполнения YQL](parameterized-queries-cli.md). + diff --git a/ydb/docs/ru/core/reference/ydb-cli/table-query-execute.md b/ydb/docs/ru/core/reference/ydb-cli/table-query-execute.md index 7bc39c77ea..81491ff3e7 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/table-query-execute.md +++ b/ydb/docs/ru/core/reference/ydb-cli/table-query-execute.md @@ -1,6 +1,6 @@ # Выполнение запроса -Подкоманда `table query execute` предназначена для надежного исполнения YQL-запросов, не содержащих команд управления транзакциями или [DDL-операторов]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Data_definition_language){% else %}(https://en.wikipedia.org/wiki/Data_definition_language){% endif %}. Подкоманда обеспечивает успешное исполнение запроса при кратковременной недоступности отдельных партиций таблиц, например, связанной с [их разделением или слиянием](../../concepts/datamodel/table.md#partitioning), за счет применения встроенных политик повторных попыток (retry policies). +Подкоманда `table query execute` предназначена для надежного исполнения YQL-запросов. Подкоманда обеспечивает успешное исполнение запроса при кратковременной недоступности отдельных партиций таблиц, например, связанной с [их разделением или слиянием](../../concepts/datamodel/table.md#partitioning), за счет применения встроенных политик повторных попыток (retry policies). Общий вид команды: @@ -22,17 +22,15 @@ Имя | Описание ---|--- `--timeout` | Время, в течение которого должна быть выполнена операция на сервере. -`-t`, `--type` | Тип запроса.<br>Возможные значения:<ul><li>`data` — запрос над данными;</li><li>`scheme` — запрос над схемой данных;</li><li>`scan` — [скан-запрос](../../concepts/scan_query.md).</li></ul>Значение по умолчанию — `data`. +`-t`, `--type` | Тип запроса.<br>Возможные значения:<ul><li>`data` — YQL-запрос, содержащий [DML]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Data_Manipulation_Language){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Data_Manipulation_Language){% endif %} операции, допускает как изменение данных в базе, так и получение нескольких выборок с ограничением в 1000 строк в каждой выборке.</li><li>`scan` — YQL-запрос типа [скан](../../concepts/scan_query.md), допускает только чтение данных из базы, может вернуть только одну выборку, но без ограничения на количество записей в ней. Алгоритм исполнения запроса типа `scan` на сервере более сложный по сравнению с `data`, поэтому в отсутствие требований по возврату более 1000 строк эффективнее использовать тип запроса `data`.</li><li>`scheme` — YQL-запрос, содержащий [DDL]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Data_Definition_Language){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Data_Definition_Language){% endif %} операции.</li></ul>Значение по умолчанию — `data`. `--stats` | Режим сбора статистики.<br>Возможные значения:<ul><li>`none` — не собирать;</li><li>`basic` — собирать по основным событиям;</li><li>`full` — собирать по всем событиям.</li></ul>Значение по умолчанию — `none`. `-s` | Включить сбор статистики в режиме `basic`. -`--tx-mode` | Указать [режим транзакций](../../concepts/transactions.md#modes) (для запросов типа `data`).<br>Возможные значения:<ul><li>`serializable-rw` — результат успешно выполненных параллельных транзакций эквивалентен определенному последовательному порядку их выполнения;</li><li>`online-ro` — каждое из чтений в транзакции читает последние на момент своего выполнения данные;</li><li>`stale-ro` — чтения данных в транзакции возвращают результаты с возможным отставанием от актуальных (доли секунды).</li></ul>Значение по умолчанию — `serializable-rw`. +`--tx-mode` | [Режим транзакций](../../concepts/transactions.md#modes) (для запросов типа `data`).<br>Возможные значения:<ul><li>`serializable-rw` — результат успешно выполненных параллельных транзакций эквивалентен определенному последовательному порядку их выполнения;</li><li>`online-ro` — каждое из чтений в транзакции читает последние на момент своего выполнения данные;</li><li>`stale-ro` — чтения данных в транзакции возвращают результаты с возможным отставанием от актуальных (доли секунды).</li></ul>Значение по умолчанию — `serializable-rw`. `-q`, `--query` | Текст YQL-запроса для выполнения. `-f,` `--file` | Путь к файлу с текстом YQL-запроса для выполнения. -`--format` | Формат вывода.<br>Возможные значения:<ul><li>`pretty` (по умолчанию) — человекочитаемый формат;</li><li>`json-unicode` — вывод в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, бинарные строки закодированы в [Юникод]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Юникод){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Unicode){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-unicode-array` — вывод в формате JSON, бинарные строки закодированы в Юникод, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64` — вывод в формате JSON, бинарные строки закодированы в [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64-array` — вывод в формате JSON, бинарные строки закодированы в Base64, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке;</li><li>`csv` —вывод в формате [CSV](https://ru.wikipedia.org/wiki/CSV);</li><li>`tsv` —вывод в формате [TSV](https://ru.wikipedia.org/wiki/TSV).</li></ul> +`--format` | Формат вывода.<br>Возможные значения:<ul><li>`pretty` (по умолчанию) — Человекочитаемый формат;</li><li>`json-unicode` — [Newline-delimited JSON stream](https://en.wikipedia.org/wiki/JSON_streaming). Каждая строка выборки выводится в отдельной строке вывода, каждая строка представлена в виде однострочного JSON. Если в запросе несколько выборок, записи из них будут выведены последовательно без дополнительных разделителей.</li><li>`json-unicode-array` — Один JSON документ, содержащего массив строк выборки.</li><li>`json-base64` — аналогично `json-unicode`, но колонки с бинарными строками (тип `String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}.</li><li>`json-base64-array` — аналогично `json-unicode-array`, но колонки с бинарными строками (тип `String`) представлены в кодировке [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}</li><li>`csv` —вывод в формате [CSV](https://ru.wikipedia.org/wiki/CSV);</li><li>`tsv` —вывод в формате [TSV](https://ru.wikipedia.org/wiki/TSV).</li></ul> -При исполнении YQL-запроса командой `table query execute` применяются политики повторных попыток, обеспечивающие надежное исполнение запроса и продолжение обработки потока параметров на `stdin` при изменении набора партиций в таблицах, а также других стандартных ситауциях в распределенной базе данных, вызывающих кратковременную невозможность выполнения операций над частью данных. - -### Параметры для работы с параметризованными запросами {#parameterized-query} +### Работа с параметризованными запросами {#parameterized-query} {% include [parameterized-query](../../_includes/parameterized-query.md) %} @@ -40,27 +38,88 @@ {% include [ydb-cli-profile](../../_includes/ydb-cli-profile.md) %} -Выполните data-запрос к данным: +### Создание таблиц {#examples-create-tables} + +```bash +{{ ydb-cli }} -p quickstart table query execute \ + --type scheme \ + -q ' + CREATE TABLE series (series_id Uint64 NOT NULL, title Utf8, series_info Utf8, release_date Date, PRIMARY KEY (series_id)); + CREATE TABLE seasons (series_id Uint64, season_id Uint64, title Utf8, first_aired Date, last_aired Date, PRIMARY KEY (series_id, season_id)); + CREATE TABLE episodes (series_id Uint64, season_id Uint64, episode_id Uint64, title Utf8, air_date Date, PRIMARY KEY (series_id, season_id, episode_id)); + ' +``` + +### Заполнение таблиц данными {#examples-upsert} +```bash +{{ ydb-cli }} -p quickstart table query execute \ + -q ' +UPSERT INTO series (series_id, title, release_date, series_info) VALUES + (1, "IT Crowd", Date("2006-02-03"), "The IT Crowd is a British sitcom produced by Channel 4, written by Graham Linehan, produced by Ash Atalla and starring Chris O'"'"'Dowd, Richard Ayoade, Katherine Parkinson, and Matt Berry."), + (2, "Silicon Valley", Date("2014-04-06"), "Silicon Valley is an American comedy television series created by Mike Judge, John Altschuler and Dave Krinsky. The series focuses on five young men who founded a startup company in Silicon Valley."); + +UPSERT INTO seasons (series_id, season_id, title, first_aired, last_aired) VALUES + (1, 1, "Season 1", Date("2006-02-03"), Date("2006-03-03")), + (1, 2, "Season 2", Date("2007-08-24"), Date("2007-09-28")), + (2, 1, "Season 1", Date("2014-04-06"), Date("2014-06-01")), + (2, 2, "Season 2", Date("2015-04-12"), Date("2015-06-14")); + +UPSERT INTO episodes (series_id, season_id, episode_id, title, air_date) VALUES + (1, 1, 1, "Yesterday'"'"'s Jam", Date("2006-02-03")), + (1, 1, 2, "Calamity Jen", Date("2006-02-03")), + (2, 1, 1, "Minimum Viable Product", Date("2014-04-06")), + (2, 1, 2, "The Cap Table", Date("2014-04-13")); +' +``` + +### Простая выборка данных {#examples-simple-query} + +```bash +{{ ydb-cli }} -p quickstart table query execute -q ' + SELECT season_id, episode_id, title + FROM episodes + WHERE series_id = 1 + ' +``` + +Результат: + +```text +┌───────────┬────────────┬───────────────────┐ +| season_id | episode_id | title | +├───────────┼────────────┼───────────────────┤ +| 1 | 1 | "Yesterday's Jam" | +├───────────┼────────────┼───────────────────┤ +| 1 | 2 | "Calamity Jen" | +└───────────┴────────────┴───────────────────┘ +``` + +### Неограниченная по размеру выборка для автоматизированной обработки {#examples-query-stream} + +Выборка данных запросом, текст которого сохранен в файле, без ограничения на количество строк в выборке, с выводом в формате [Newline-delimited JSON stream](https://en.wikipedia.org/wiki/JSON_streaming). + +Запишем текст запроса в файл `request1.yql`: ```bash -{{ ydb-cli }} table query execute \ - --query "SELECT season_id, episode_id, title \ - FROM episodes \ - WHERE series_id = 1 AND season_id > 1 \ - ORDER BY season_id, episode_id \ - LIMIT 3" +echo 'SELECT season_id, episode_id, title FROM episodes' > request1.yql +``` + +Выполним запрос: + +```bash +{{ ydb-cli }} -p quickstart table query execute -f request1.yql --type scan --format json-unicode ``` Результат: ```text -┌───────────┬────────────┬──────────────────────────────┐ -| season_id | episode_id | title | -├───────────┼────────────┼──────────────────────────────┤ -| 2 | 1 | "The Work Outing" | -├───────────┼────────────┼──────────────────────────────┤ -| 2 | 2 | "Return of the Golden Child" | -├───────────┼────────────┼──────────────────────────────┤ -| 2 | 3 | "Moss and the German" | -└───────────┴────────────┴──────────────────────────────┘ +{"season_id":1,"episode_id":1,"title":"Yesterday's Jam"} +{"season_id":1,"episode_id":2,"title":"Calamity Jen"} +{"season_id":1,"episode_id":1,"title":"Minimum Viable Product"} +{"season_id":1,"episode_id":2,"title":"The Cap Table"} ``` + +### Передача параметров {#examples-params} + +Примеры исполнения параметризованных запросов, включая потоковое исполнение, приведены в статье [Передача параметров в команды исполнения YQL](parameterized-queries-cli.md). + diff --git a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml index a0369b4112..00429032aa 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml +++ b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml @@ -75,7 +75,7 @@ items: href: scripting-yql.md - name: Выполнение запроса href: table-query-execute.md - - name: Передача параметров в команды выполнения YQL-запросов + - name: Выполнение параметризованных запросов href: parameterized-queries-cli.md # - name: Утилиты # items: diff --git a/ydb/docs/ru/core/reference/ydb-cli/topic-consumer-drop.md b/ydb/docs/ru/core/reference/ydb-cli/topic-consumer-drop.md index f731703bc3..2532a4c68d 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/topic-consumer-drop.md +++ b/ydb/docs/ru/core/reference/ydb-cli/topic-consumer-drop.md @@ -31,7 +31,7 @@ Удалите [созданного ранее](#consumer-add) читателя с именем `my-consumer` для топика `my-topic`: ```bash -{{ ydb-cli }} -p db1 topic consumer drop \ +{{ ydb-cli }} -p quickstart topic consumer drop \ --consumer my-consumer \ my-topic ``` diff --git a/ydb/docs/ru/core/reference/ydb-cli/topic-pipeline.md b/ydb/docs/ru/core/reference/ydb-cli/topic-pipeline.md index 042fdebbc9..c21b8847ce 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/topic-pipeline.md +++ b/ydb/docs/ru/core/reference/ydb-cli/topic-pipeline.md @@ -2,30 +2,30 @@ Возможности работы команд `topic read` и `topic write` со стандартными устройствами ввода/вывода, а также поддержка потокового режима на чтении, позволяет выстраивать полноценные сценарии интеграции с передачей сообщений между топиками и их преобразованиями. В данном разделе собраны несколько примеров подобных сценариев. -* Перекладывание одного сообщения из `topic1` в базе данных `db1` в `topic2` в базе данных `db2`, с ожиданием его появления в топике-источнике +* Перекладывание одного сообщения из `topic1` в базе данных `quickstart` в `topic2` в базе данных `db2`, с ожиданием его появления в топике-источнике ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 -w | {{ ydb-cli }} -p db2 topic write topic2 + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 -w | {{ ydb-cli }} -p db2 topic write topic2 ``` -* Фоновая передача всех появляющихся однострочных сообщений в топике `topic1` в базе данных `db1`, в топик `topic2` в базе данных `db2`. Данный сценарий можно использовать в случае, если гарантируется отсутствие байтов `0x0A` (перевод строки) в исходных сообщениях. +* Фоновая передача всех появляющихся однострочных сообщений в топике `topic1` в базе данных `quickstart`, в топик `topic2` в базе данных `db2`. Данный сценарий можно использовать в случае, если гарантируется отсутствие байтов `0x0A` (перевод строки) в исходных сообщениях. ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 --format newline-delimited -w | \ + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 --format newline-delimited -w | \ {{ ydb-cli }} -p db2 topic write topic2 --format newline-delimited ``` -* Фоновая передача точной бинарной копии всех появляющихся сообщений в топике `topic1` в базе данных `db1`, в топик `topic2` в базе данных `db2`, с использованием кодировки сообщений base64 на потоке передачи. +* Фоновая передача точной бинарной копии всех появляющихся сообщений в топике `topic1` в базе данных `quickstart`, в топик `topic2` в базе данных `db2`, с использованием кодировки сообщений base64 на потоке передачи. ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 --format newline-delimited -w --transform base64 | \ - {{ ydb-cli }} -p db2 topic write topic2 --format newline-delimited --transform base64 + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 --format newline-delimited -w --transform base64 | \ + {{ ydb-cli }} -p quickstart topic write topic2 --format newline-delimited --transform base64 ``` * Передача ограниченного пакета однострочных сообщений с фильтрацией по подстроке `ERROR` ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 --format newline-delimited | \ + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 --format newline-delimited | \ grep ERROR | \ {{ ydb-cli }} -p db2 topic write topic2 --format newline-delimited ``` @@ -33,8 +33,8 @@ * Запись результата исполнения YQL-запроса в виде сообщений в топик `topic1` ```bash - {{ ydb-cli }} -p db1 yql -s "select * from series" --format json-unicode | \ - {{ ydb-cli }} -p db1 topic write topic1 --format newline-delimited + {{ ydb-cli }} -p quickstart yql -s "select * from series" --format json-unicode | \ + {{ ydb-cli }} -p quickstart topic write topic1 --format newline-delimited ``` ### Исполнение YQL-запроса с передачей сообщений из топика в качестве параметров {#example-read-to-yql-param} @@ -42,16 +42,16 @@ * Исполнение YQL-запроса с передачей параметром каждого сообщения, считанного из топика `topic1` ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 --format newline-delimited -w | \ - {{ ydb-cli }} -p db1 table query execute -q 'declare $s as String;select Len($s) as Bytes' \ + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 --format newline-delimited -w | \ + {{ ydb-cli }} -p quickstart table query execute -q 'declare $s as String;select Len($s) as Bytes' \ --stdin-format newline-delimited --stdin-par s --stdin-format raw ``` * Исполнение YQL-запроса с адаптивным пакетированием параметров из сообщений, считанных из топика `topic1` ```bash - {{ ydb-cli }} -p db1 topic read topic1 -c c1 --format newline-delimited -w | \ - {{ ydb-cli }} -p db1 table query execute \ + {{ ydb-cli }} -p quickstart topic read topic1 -c c1 --format newline-delimited -w | \ + {{ ydb-cli }} -p quickstart table query execute \ -q 'declare $s as List<String>;select ListLength($s) as Count, $s as Items' \ --stdin-format newline-delimited --stdin-par s --stdin-format raw \ --batch adaptive diff --git a/ydb/docs/ru/core/reference/ydb-cli/yql-query-overview.md b/ydb/docs/ru/core/reference/ydb-cli/yql-query-overview.md index 7481eeec24..bcfa1aa1bd 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/yql-query-overview.md +++ b/ydb/docs/ru/core/reference/ydb-cli/yql-query-overview.md @@ -6,4 +6,5 @@ * [ydb scripting yql](scripting-yql.md) — выполняет запросы и скрипты YQL, имеет ограничения на объем возвращаемых данных. Также с помощью этой команды вы можете просмотреть план выполнения запроса и метаданные ответа. * [ydb table query execute](table-query-execute.md) - выполняет [DML-запросы](https://en.wikipedia.org/wiki/Data_manipulation_language#SQL) с заданным уровнем изоляции транзакции и применением типовой политики повторных попыток. -О выполнении параметризованных запросов в {{ ydb-short-name }} CLI читайте в статье [{#T}](./parameterized-queries-cli.md). +Все перечисленные команды поддерживают одинаковые возможности [параметризации запросов YQL](parameterized-queries-cli.md). + diff --git a/ydb/docs/ru/core/reference/ydb-cli/yql.md b/ydb/docs/ru/core/reference/ydb-cli/yql.md index d0074d5d0c..971f3efe27 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/yql.md +++ b/ydb/docs/ru/core/reference/ydb-cli/yql.md @@ -27,7 +27,7 @@ `-f`, `--file` | Путь к файлу с текстом YQL-скрипта для выполнения. `--format` | Формат вывода.<br>Возможные значения:<ul><li>`pretty` (по умолчанию) — человекочитаемый формат;</li><li>`json-unicode` — вывод в формате [JSON]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/JSON){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/JSON){% endif %}, бинарные строки закодированы в [Юникод]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Юникод){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Unicode){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-unicode-array` — вывод в формате JSON, бинарные строки закодированы в Юникод, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64` — вывод в формате JSON, бинарные строки закодированы в [Base64]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Base64){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Base64){% endif %}, каждая строка JSON выводится в отдельной строке;</li><li>`json-base64-array` — вывод в формате JSON, бинарные строки закодированы в Base64, результат выводится в виде массива строк JSON, каждая строка JSON выводится в отдельной строке;</li><li>`csv` —вывод в формате [CSV](https://ru.wikipedia.org/wiki/CSV);</li><li>`tsv` —вывод в формате [TSV](https://ru.wikipedia.org/wiki/TSV).</li></ul> -### Параметры для работы с параметризованными запросами {#parameterized-query} +### Работа с параметризованными запросами {#parameterized-query} {% include [parameterized-query](../../_includes/parameterized-query.md) %} @@ -35,21 +35,40 @@ {% include [ydb-cli-profile](../../_includes/ydb-cli-profile.md) %} -### Выполнение запроса с таймаутом {#example-timeout} +Скрипт создания таблицы, заполнения её данными, и получения выборки из этой таблицы: -Выполните запрос с таймаутом 500 мс: +```bash +{{ ydb-cli }} -p quickstart yql -s ' + CREATE TABLE series (series_id Uint64, title Utf8, series_info Utf8, release_date Date, PRIMARY KEY (series_id)); + COMMIT; + UPSERT INTO series (series_id, title, series_info, release_date) values (1, "Title1", "Info1", Cast("2023-04-20" as Date)); + COMMIT; + SELECT * from series; + ' +``` + +Вывод команды: + +```text +┌──────────────┬───────────┬─────────────┬──────────┐ +| release_date | series_id | series_info | title | +├──────────────┼───────────┼─────────────┼──────────┤ +| "2023-04-20" | 1 | "Info1" | "Title1" | +└──────────────┴───────────┴─────────────┴──────────┘ +``` + +Выполнение скрипта из примера выше, записанного в файле `script1.yql`, с выводом результатов в формате `JSON`: ```bash -ydb yql \ - --script \ - "CREATE TABLE series ( \ - series_id Uint64, \ - title Utf8, \ - series_info Utf8, \ - release_date Uint64, \ - PRIMARY KEY (series_id) \ - );" \ - --timeout 500 +{{ ydb-cli }} -p quickstart yql -f script1.yql --format json-unicode ``` -Если сервер не успеет выполнить запрос за 500 мс, он ответит ошибкой. Если по какой либо причине клиент не сможет получить сообщение сервера об ошибке, то операция будет прервана через 500+200 мс на стороне клиента. +Вывод команды: + +```text +{"release_date":"2023-04-20","series_id":1,"series_info":"Info1","title":"Title1"} +``` + + +Примеры передачи параметров в скрипты приведены в [статье о передаче параметров в команды исполнения YQL](parameterized-queries-cli.md). + |