Skip to content

Instantly share code, notes, and snippets.

@spugachev
Created April 24, 2017 20:07
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save spugachev/709b73fa18bf3fb8891dea69843ddb19 to your computer and use it in GitHub Desktop.
Save spugachev/709b73fa18bf3fb8891dea69843ddb19 to your computer and use it in GitHub Desktop.
Введение в работу с Tarantool

Работа с Tarantool

Начать работу с Tarantool можно запустив обучающий туториал на официальном сайте https://tarantool.org/en/try.html

Это позволяет попробовать Tarantool прямо из браузера сразу и без регистрации. Также на официальном сайте представлены инструкции по установке и запуску Tarantool в macOS, популярных дистрибутивах Linux и FreeBSD. Версии для Windows Tarantool не имеет.

Но не спешите сразу устанавливать Tarantool непосредственно в операционную систему. Самым удобным способом быстро запустить и попробовать Tarantool на Linux, macOS или Windows является Docker. Если у вас уже установлен Docker, то запуск контейнера с Tarantool может быть выполнен одной командой:

docker run --name mytarantool -d tarantool/tarantool:1.7

Если образ Tarantool 1.7 еще не скачан, то он автоматически скачается, и новый контейнер, созданный из этого образа, будет запущен. Всё. Мы запустили Tarantool! Параметр -d (detached) говорит о том, что контейнер необходимо запустить в фоне. Поэтому всё, что вы увидите в консоли после выполнения команды, — это ID контейнера.

Далее нужно подключиться к консоли Tarantool, запущенного в контейнере:

docker exec -it mytarantool console

Мы подключаемся к контейнеру с именем mytarantool и выполняем в нём команду console в интерактивном режиме. После этого откроется консоль Tarantool, и вы сможете выполнять в ней любые команды.

Создадим space для хранения данных. Space’ы в Tarantool — это аналог коллекций в MongoDB, ну, или таблиц в традиционных СУБД.

tarantool> box.schema.space.create('customers')

Представленная выше команда - это код на языке Lua. Box - основной модуль Tarantool, отвечающий за функциональность СУБД. Tarantool напрямую и через консоль предоставляет полноценный Lua интерпретатор, в котором вы можете задавать переменные и функции, а также загружать и вызывать сторонние Lua пакеты (пакеты в терминологии Lua называются “rocks”. LuaRocks - менеджер пакетов). Естественно запросы к Tarantool можно делать и из других языков программирования. Написаны и поддерживаются коннекторы для Node.js, PHP, Go, Java, .NET, R, Erlang, C, Perl, Python. В разработке коннектор, использующий SQL синтаксис.

Создадим первичный индекс по первому полю (также мы можем создавать вторичные и составные индексы):

tarantool> box.space.customers:create_index('primary', {type = 'tree', parts = {1, 'UNSIGNED'}})

Двоеточие в вызове customers:create_index необходимо для эмуляции объектной ориентированности и корректной передачи параметра self. Следующие два вызова будут эквивалентны (обратите внимание на точку в одном случае и двоеточие в другом):

tarantool> box.space.customers:select({})

и

tarantool> box.space.customers.select(box.space.customers,{})

Теперь вставим в space customers несколько записей. Одну с явным указанием первичного ключа, а другую — с помощью автоматического инкремента (скобки вокруг единственного параметра убраны намеренно):

tarantool> box.space.customers:insert{1, 'Sergey', 'Moscow'}
tarantool> box.space.customers:auto_increment{'Ivan', 'San-Francisco'}

Теперь запросим все записи:

tarantool> box.space.customers:select{}

Перед нами в консоли в YAML-формате будут выведены две только что добавленные записи.

---
- - [1, 'Sergey', 'Moscow']
  - [2, 'Ivan', 'San-Francisco']
...

Представленный выше код может показаться простым, но давайте посмотрим более сложный сценарий - код, необходимый для того чтобы сделать REST сервис, выдающий содержимое space’а customers в JSON формате.

function customers_handler(self)
    return self:render{ json = box.space.customers:select{} }
end

httpd = require('http.server')
server = httpd.new(nil, 8080)
server:route({ path = '/customers'  }, customers_handler)
server:start()

Код говорит сам за себя, и наверное не требует пояснений. Более полные примеры можно найти в официальной документации. Если вы хотите протестировать работу данного REST сервиса, не забудьте сделать доступным порт 8080 снаружи Docker контейнера.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment