TDG Documentation portal logo
Помощь
Обновлена 22 июня 2026 г. в 15:31

Запросы данных

Глава посвящена запросам данных в TDG. В ней описаны логика и синтаксис запросов, а также представлено несколько сценариев использования.

В качестве среды для выполнения запросов вы будете использовать уже развернутый TDG-кластер.

Подготовка модели данных

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

  1. Определение модели данных.
  2. Загрузка модели данных.

Модель данных загружена. Теперь можно добавлять, выбирать и удалять данные.

Загрузка данных

Загрузить данные в TDG можно с помощью мутации GraphQL:

  1. В меню слева выберите вкладку GraphQL.

  2. Выберите default в качестве нужной схемы и очистите поле запроса.

    Вкладка GraphQL

  3. В поле слева вставьте следующий запрос:

mutation all {    russia:Country(insert: {        title: "Russia",        phone_code: "+7"}) {    title    phone_code    }    germany:Country(insert: {        title: "Germany",        phone_code: "+49"}) {    title    }    moscow:City(insert: {        title: "Moscow",        country: "Russia",        population: 12655050,        capital: true,        postcodes: [101000, 119021, 115035, 109028, 109004]}) {    title    country    population    capital    postcodes    }    spb:City(insert: {        title: "Saint Petersburg",        country: "Russia",        population: 5384342,        capital: false,        postcodes: [191193, 191040, 195275, 983002, 983015]}) {    title    country    population    capital    postcodes    }    tver:City(insert: {        title: "Tver",        country: "Russia",        population: 424969,        capital: false,        postcodes: [170006, 170100, 170037, 170028]}) {    title    country    population    capital    postcodes    }    berlin:City(insert: {        title: "Berlin",        country: "Germany",        population: 3520031,        capital: true,        postcodes: [10115, 110117, 10245, 10367]}) {    title    country    population    capital    postcodes    }    munich:City(insert: {        title: "Munich",        country: "Germany",        population: 1450381,        capital: false,        postcodes: [80339, 80336, 80639, 80798]}) {    title    country    population    capital    postcodes    }    dresden:City(insert: {        title: "Dresden",        country: "Germany",        population: 547172,        capital: false,        postcodes: [40210, 40212, 40595, 40627]}) {    title    country    population    capital    postcodes    }}
  1. Выполните мутацию, нажав кнопку Execute Query (Выполнить запрос):

    Загрузка данных

Данные загружены, как видно по ответу системы в поле справа.

Запросы данных

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

Примеры запросов GraphQL, приведенные ниже, проще всего запустить через встроенный клиент GraphiQL в веб-интерфейсе TDG. Отправляя запросы на доступ к данным, используйте схему по умолчанию (default):

  1. В меню слева выберите вкладку GraphQL.
  2. Выберите default в качестве нужной схемы, очистите поле запроса и вставьте код примера.

Общий запрос объектов по типу

Чтобы выбрать объекты определенного типа, укажите имя типа, а также нужные вам поля, значения которых требуется получить. Не обязательно указывать все поля объекта, определенные в модели данных. Пример:

query {  Country {    title  }}

Ответ - объект JSON, содержащий массив со всеми записями типа Country. Для каждой записи ответ включает только указанные в запросе поля.

{  "data": {    "Country": [      {        "title": "Russia"      },      {        "title": "Germany"      }    ]  }}

Запросы по первичному индексу

С помощью первичного индекса можно выбрать отдельный объект:

query {  Country(title: "Germany") {    title    phone_code  }}

Запросы по вторичному индексу

У запросов по вторичному индексу такой же синтаксис:

query {  City(country: "Russia") {    title    country    population  }}

Запросы по составному индексу

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

query {  City(primary: ["Saint Petersburg", "Russia"]) {    title    country    population  }}

Запросы по мультиключевому индексу

Мультиключевой индекс (multikey index) - это индекс по полю, которое содержит массив. Если под условие запроса по мультиключевому индексу подходят несколько элементов массива, будет несколько ключей, указывающих на один и тот же объект. Такой объект вернется несколько раз, и это нужно учитывать при составлении запросов и при обработке полученных результатов.

Кроме того, есть ряд ограничений при работе с мультиключевыми индексами:

Пример:

{  City(postcodes_gt: 983000) {    title    postcodes  }}

Запрос вернет объект дважды:

{  "data": {    "City": [      {        "title": "Saint Petersburg",        "postcodes": [          191193,          191040,          195275,          983002,          983015        ]      },      {        "title": "Saint Petersburg",        "postcodes": [          191193,          191040,          195275,          983002,          983015        ]      }    ]  }}

Операторы сравнения

Операторы сравнения представлены суффиксами, которые добавляются к именам индексов.

Поддерживаются следующие операторы:

  • _gt (больше)
  • _ge (больше или равно)
  • _lt (меньше)
  • _le (меньше или равно)

Пример:

query {  City(population_ge: 1000000) {    title    country    population  }}

При поиске по строковому индексу поддерживаются операторы:

  • _like - выборка по шаблону;
  • _ilike - выборка по шаблону без учета регистра.

В шаблонах можно использовать подстановочный символ %.

query {  City(title_like: "M%") {    title    country  }}

Множественные условия

В одном запросе можно сочетать несколько условий. Тогда TDG будет искать объекты, удовлетворяющие всем условиям одновременно (логическое И). Указывайте в условиях только индексированные поля.

query {  City(country: "Russia", population_lt: 1000000) {    title    country    population  }}

Запросы по отношениям

Чтобы выбрать объекты по отношениям, используйте тот же синтаксис, что и в общем запросе объектов по типу.

В примере модели между объектами Country и City есть связь один ко многим. Поэтому вы можете одним запросом получить данные как о стране, так и о городах.

query {    Country(title: "Russia") {        title        city {            title            population    }    }}

Пример ответа:

{  "data": {    "Country": [      {        "title": "Russia",        "city": [          {            "title": "Moscow",            "population": 12655050          },          {            "title": "Saint Petersburg",            "population": 5384342          },          {            "title": "Tver",            "population": 424969          }        ]      }    ]  }}

Пагинация

В TDG применяется пагинация на основе курсора. Похожий механизм описан в документации GraphQL.

У запроса с пагинацией следующий синтаксис:

query {    object_name(first:N, after:$cursor)    }

Пояснение:

  • first определяет максимальное количество возвращаемых элементов (по умолчанию 10).
  • after передает непрозрачный курсор - строку, определяющую элемент, с которого система TDG должна продолжить выполнение запроса.

Вот первый запрос с пагинацией:

query {    City(first: 2) {        title        country        cursor    }}

Ответ:

{  "data": {    "City": [      {        "cursor": "gaRzY2FukqZCZXJsaW6nR2VybWFueQ",        "country": "Germany",        "title": "Berlin"      },      {        "cursor": "gaRzY2FukqdEcmVzZGVup0dlcm1hbnk",        "country": "Germany",        "title": "Dresden"      }    ]  }}

Чтобы получить следующую группу данных, возьмите значение поля cursor последнего полученного объекта и передайте его в качестве аргумента after в следующем запросе:

query {    City(first: 2, after: "gaRzY2FukqdEcmVzZGVup0dlcm1hbnk") {        title        country        cursor    }}

Повторяйте эту логику, пока не получите пустую страницу:

{  "data": {    "City": []  }}

Для запросов с отношениями пагинация работает аналогичным образом:

query {  Country(title: "Russia") {    title    city(first: 2) {        title        population        cursor    }  }}

Страницы результатов можно выводить и в обратном порядке. В этом случае TDG будет возвращать объекты, предшествующие отмеченному курсором элементу. Чтобы страницы выводились в обратном порядке, укажите для аргумента first отрицательное значение:

query {    City(first: -2) {        title        country        cursor    }}

Запросы по версии

В TDG реализовано версионирование объектов, поэтому в условие запроса можно включать версии. Подробности вы найдете на этой странице: /development/versioning.

Выбор экземпляров для выполнения запросов

В TDG можно определить, на каких узлах будет выполняться запрос.

Поддерживаются следующие параметры:

  • mode - установка целевого экземпляра для выполнения запроса. Тип: string. Значения:

    • write - целевым узлом будет мастер;
    • read - значение по умолчанию.
  • prefer_replica - установка реплики в качестве целевого экземпляра для выполнения запроса. Тип: boolean. Значения:

    • true - предпочитаемой целью будет одна из реплик. Если доступной реплики нет, то запрос будет выполнен на мастере.
    • false (по умолчанию) - запрос будет выполнен на мастер-узле.

    Параметр полезен для ресурсозатратных функций, чтобы избежать снижения скорости работы мастер-узлов;

  • balance - управление балансировкой нагрузки. Тип: boolean. Значения:

    • true (по умолчанию) - запросы будут распределяться по всем экземплярам набора реплик по кругу. При этом, если prefer_replica = true, предпочтение отдается репликам.
    • false - балансировка отключена.

Чтобы установить эти параметры, используйте в запросе GraphQL-директиву @options:

query {    City @options(mode: read, balance: true) {        title        country        population    }}

Эти параметры также можно определить в некоторых функциях программного интерфейса репозитория. Подробности вы найдете на странице Repository API.