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

Hello world на Lua

Из этого руководства вы узнаете, как настраивать модель данных, выполнять запросы и создавать хранимые процедуры на языке Lua.

Для начала вам понадобится запущенный экземпляр TDG. Можно запустить TDG в Docker-контейнере или же развернуть его на локальной машине вручную или с помощью Ansible.

Затем вы сможете:

  1. настроить модель данных;
  2. выполнить запрос данных;
  3. написать хранимые процедуры.

Настройка модели данных

В этом руководстве используется модель данных, содержащая два типа объектов: музыкальные группы и исполнители. У каждой музыкальной группы есть название, жанр и год ее создания. Для исполнителей указываются имена, страны происхождения и инструменты, на которых они играют.

Вот пример такой модели:

[    {        "name": "MusicBand",        "type": "record",        "fields": [            {"name": "name", "type": "string"},            {"name": "genre", "type": {"type":"array", "items":"string"}},            {"name": "wasformed", "type":"long"}        ],        "indexes": ["name", "genre", "wasformed"]    },    {        "name": "Artist",        "type": "record",        "fields": [            {"name": "fullname", "type": "string"},            {"name": "country", "type": "string"},            {"name": "instruments", "type": {"type":"array", "items":"string"}}        ],        "indexes": ["fullname"]    }]

В меню слева есть вкладка Model. Откройте ее и вставьте модель в поле Request. Нажмите Submit:

Модель данных

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

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

В меню слева есть вкладка под названием Graphql. Откройте эту вкладку, выберите необходимую схему default и удалите всё из поля запроса:

Вкладка Graphql

В поле запроса вставьте такие данные:

mutation all {  rammstein:MusicBand(insert: {      name: "Rammstein",      genre: ["metal", "industrial", "gothic"],      wasformed: 1994}) {    name    genre    wasformed  }  linkinpark:MusicBand(insert: {      name: "Linkin Park",      genre: ["alternative", "metal"],      wasformed: 1996}) {    name    genre    wasformed  }  blacksabbath:MusicBand(insert: {      name: "Black Sabbath",      genre: ["gothic", "metal"],      wasformed: 1968}) {    name    genre    wasformed  }  deeppurple:MusicBand(insert:{      name: "Deep Purple",      genre: ["metal", "rock"],      wasformed: 1968}) {    name    genre    wasformed  }  maxkorzh:MusicBand(insert:{      name:"Max Korzh",      genre:["rap", "electro"],      wasformed: 2006}) {    name    genre    wasformed  }}

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

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

Данные загружены.

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

Чтение данных

Читать данные можно на вкладке Graphql. Убедитесь, что выбрана схема default, удалите всё из поля слева и напишите запрос на выборку всех музыкальных групп:

query {  MusicBand {    name    wasformed    genre  }}

Нажмите кнопку воспроизведения. В поле справа вы увидите результат:

Чтение всех данных

Выполните выборку данных по первичному ключу:

query {  MusicBand(name:"Black Sabbath") {    name    wasformed    genre  }}

Нажав на кнопку воспроизведения, вы получите всю сохраненную информацию о группе Black Sabbath:

Чтение данных об одной музыкальной группе

Изменение данных

Добавьте еще один музыкальный жанр для одной из групп. Для этого на вкладке Graphql внесите информацию о двух жанрах для группы:

mutation {  MusicBand(insert:{      name: "Deep Purple",      genre: ["metal", "rock"],      wasformed: 1968}) {        name        genre        wasformed  }}

Нажмите кнопку воспроизведения. Информация о группе Deep Purple обновилась.

Удаление данных

На вкладке Graphql напишите запрос на удаление всех данных об одной из музыкальных групп:

mutation {  MusicBand(name:"Linkin Park" delete:true) {    name    genre    wasformed  }}

Нажмите кнопку воспроизведения. Все данные о музыкальной группе Linkin Park удалены.

Написание хранимых процедур

Hello World

В меню слева есть вкладка Code. Откройте эту вкладку и создайте директорию src. В директории src создайте файл hello.lua, представляющий собой Lua-модуль для экспорта функций:

function hello()  return "Hello World"endreturn {  hello = hello}

Нажмите Apply:

Создание файла hello.lua

Для этого Lua-модуля необходим GraphQL-интерфейс. На вкладке Code создайте файл под названием services.yml и задайте сигнатуру GraphQL-вызова:

hello_world:  doc: "Hello World script"  function: hello.hello  return_type: string

Нажмите Apply:

Создание GraphQL-интерфейса

Код проверяется и загружается в кластер. Если произойдет ошибка, в правом нижнем углу вы увидите уведомление с ее описанием.

Откройте вкладку Graphql, выберите необходимую схему default и вызовите хранимую процедуру:

{  hello_world}

В поле справа вы получите результат:

Hello World

Плейлист со случайным порядком воспроизведения

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

На вкладке Code откройте директорию src и создайте файл под названием playlist.lua. В этом файле задайте логику для создания плейлиста со случайным порядком воспроизведения:

local repository = require('repository')function shuffle(tbl)  for i = #tbl, 2, -1 do    local j = math.random(i)    tbl[i], tbl[j] = tbl[j], tbl[i]  end  return tblendfunction playlist()  local result = repository.find("MusicBand", {})  result = result or {}  shuffle(result)  return resultendreturn {    playlist=playlist}

В файле services.yml задайте сигнатуру GraphQL-вызова:

playlist:    doc: "Return randomized playlist"    function: playlist.playlist    return_type: {"type":"array", "items":"MusicBand"}

Перейдите на вкладку Graphql и выполните такую команду:

{    playlist { name }}

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

Плейлист со случайным порядком воспроизведения

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