Запись и получение данных в словаре¶
В этом руководстве показано, как записать в словарь данные, а затем получить запись из базы данных с обогащением из словаря. Для примера используется база данных с категориями денежных трат.
Содержание:
Пререквизиты¶
Для выполнения примера требуются:
- установленный Docker-образ Tarantool DB; 
- приложение Docker Compose; 
- утилита tt CLI; 
- исходные файлы примера - dictionary.- Примечание - Есть два способа получить исходные файлы примера: - Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива: - tarantooldb-documentation-3.0.0.tar.gz. Пример- dictionaryрасположен в таком архиве в директории- ./doc/examples/dictionary/.
- Отдельный архив dictionary.tar.gz, скачанный c сайта Tarantool. 
 
Запуск стенда и подключение к узлу¶
Для успешного запуска должны быть свободны следующие порты:
- 2379 
- 3301–3308 
- 8081 
Перейдите в папку с примером dictionary:
cd ./doc/examples/dictionary
Запустите стенд:
make start
Команда развернет стенд, который состоит из:
- кластера Tarantool DB: - 2 роутера; 
- 2 набора реплик по 3 хранилища; 
 
- кластера etcd из 3 узлов; 
- 1 узла Tarantool Cluster Manager (TCM). 
После запуска должны работать все контейнеры, кроме init_host.
Также после запуска кластера становится доступен веб-интерфейс TCM. Для входа в TCM откройте в браузере адрес http://localhost:8081. Логин и пароль для входа:
- Username: - admin
- Password: - secret
В TCM откройте вкладку Stateboard.
Выберите в наборе реплик storage-1 узел storage-1-msk и в открывшемся окне перейдите на вкладку Terminal.
Во вкладке Terminal проверьте наличие спейсов money_moves, dictionary_data и dictionary_vclock:
box.space
Узнать больше о спейсе dictionary_data можно в разделе Начало работы с модулем dictionary.
Запись данных в словарь¶
Чтобы начать работу с базой данных через интерактивную консоль Tarantool, нужно подключиться к узлу кластера. Сделать это можно двумя способами:
- в веб-интерфейсе TCM; 
- в терминале с помощью утилиты tt CLI: - tt connect admin:secret-cluster-cookie@localhost:3301 
Подключитесь к роутеру router-msk, используя первый способ – через TCM. Для этого:
- Перейдите на вкладку Stateboard. 
- Нажмите на набор реплик - router-msk.
- Выберите узел - router-mskи в открывшемся окне перейдите на вкладку Terminal.
В примере ниже задается словарь с названием categories, который содержит категории денежных трат.
Для записи элементов с соответствующими им ключами в словарь используется метод dictionary_router_set().
Note
Tarantool DB 3.x поддерживает как новый формат названий методов dictionary API (dictionary_router_get()), так и старый (dictionary_router.get()).
Методы, добавленные в версии Tarantool DB 2.x и выше, поддерживают оба формата названий.
Вызвать метод в новом формате через tt CLI или в TCM во вкладке Terminal (TT Connect)
можно через box.schema.func.call, например:
box.schema.func.call('dictionary_router_set', 'categories', '1', 'Shops')
Вызвать метод в старом формате можно напрямую, например:
dictionary_router.set('categories', '1', 'Shops')
Во вкладке Terminal с помощью метода dictionary_router_set() запишите несколько элементов (Shops, Food delivery и другие) с соответствующими им ключами в словарь:
box.schema.func.call('dictionary_router_set', 'categories', '1', 'Shops')
box.schema.func.call('dictionary_router_set', 'categories', '2', 'Food delivery')
box.schema.func.call('dictionary_router_set', 'categories', '3', 'Transport')
box.schema.func.call('dictionary_router_set', 'categories', '4', 'Bills')
box.schema.func.call('dictionary_router_set', 'categories', '5', 'Med')
Note
Ключ элемента в словаре может быть только строкой.
Чтобы проверить записанные в словарь данные, используйте метод dictionary_router_get():
box.schema.func.call('dictionary_router_get', 'categories', '1')
Подготовка нормализованных данных¶
Чтобы записать нормализованные данные, выполните во вкладке Terminal следующий код:
crud.replace('money_moves', {1, box.NULL, 123, require('datetime').now(), '1', false, 260.01})
crud.replace('money_moves', {2, box.NULL, 123, require('datetime').now(), '2', false, 1234.56})
crud.replace('money_moves', {2, box.NULL, 123, require('datetime').now(), '3', false, 30})
crud.replace('money_moves', {3, box.NULL, 123, require('datetime').now(), '5', false, 1176.12})
crud.replace('money_moves', {4, box.NULL, 123, require('datetime').now(), '3', false, 30})
crud.replace('money_moves', {5, box.NULL, 123, require('datetime').now(), '3', false, 35})
crud.replace('money_moves', {6, box.NULL, 123, require('datetime').now(), '4', false, 11816.86})
crud.replace('money_moves', {7, box.NULL, 123, require('datetime').now(), '3', false, 218})
crud.replace('money_moves', {8, box.NULL, 123, require('datetime').now(), '1', false, 1026.45})
crud.replace('money_moves', {9, box.NULL, 123, require('datetime').now(), '1', false, 384.32})
crud.replace('money_moves', {10, box.NULL, 123, require('datetime').now(), '2', false, 890.99})
Проверьте записанные данные, используйте метод crud.get():
crud.get('money_moves', 1)
Чтение данных с обогащением из словаря¶
Чтобы получить запись с добавленной информацией из словаря, выполните во вкладке Terminal следующую команду:
box.schema.func.call('get_money_move', 1)
Остановка стенда¶
Чтобы остановить стенд, выполните в локальном терминале следующую команду:
make stop