Запись и получение данных в словаре
В этом руководстве показано, как записать в словарь данные, а затем получить запись из базы данных с обогащением из словаря. Для примера используется база данных с категориями денежных трат.
Содержание:
- Пререквизиты
- Запуск стенда и подключение к узлу
- Запись данных в словарь
- Подготовка нормализованных данных
- Чтение данных с обогащением из словаря
- Остановка стенда
Для выполнения примера требуются:
-
установленный Docker-образ Tarantool DB;
-
приложение Docker Compose;
-
утилита tt CLI;
-
исходные файлы примера
dictionary.
Для успешного запуска должны быть свободны следующие порты:
- 2379
- 3301--3308
- 8081
Перейдите в папку с примером dictionary:
cd ./docs/docs/ru/assets/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:is_local: trueis_sync: falsetemporary: falseengine: memtxdictionary_vclock:is_local: trueis_sync: falsetemporary: falseengine: memtxmoney_moves:is_local: falseis_sync: falsetemporary: falseengine: memtx...
Узнать больше о спейсе 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().
Вызвать метод в новом формате через утилиту 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')
Чтобы проверить записанные в словарь данные, используйте метод dictionary_router_get():
box.schema.func.call('dictionary_router_get', 'categories', '1')
Вывод:
---- Shops- null...
Чтобы записать нормализованные данные, выполните во вкладке 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', {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)
Вывод:
---- rows:- [1, 12477, 123, '2026-03-24T13:52:27.316389Z', '1', false, 260.01]metadata: [{'name': 'money_move_id', 'type': 'number'}, {'name': 'bucket_id', 'type': 'unsigned'},{'name': 'recorder_id', 'type': 'number'}, {'name': 'dt', 'type': 'datetime'},{'name': 'category_id', 'type': 'string'}, {'name': 'income', 'type': 'boolean'},{'name': 'amount', 'type': 'number'}]- null...
Чтобы получить запись с добавленной информацией из словаря, выполните во вкладке Terminal следующую команду:
box.schema.func.call('get_money_move', 1)
Вывод:
---- bucket_id: 12477category_id: '1'money_move_id: 1recorder_id: 123amount: 260.01income: falsedt: 2026-03-24T13:52:27.316389Zcategory_name: Shops...
Чтобы остановить стенд, выполните в локальном терминале следующую команду:
make stop