Начало работы с модулем dictionary
Tarantool DB поддерживает два способа работы со словарями:
- доступ через API модуля
dictionary; - прямой доступ к данным словарей через спейс
dictionary_data.
В этом разделе описано, как настроить Tarantool DB для каждого из этих способов работы, а также приведено несколько примеров использования словарей.
Содержание:
- Управление доступом
- Определение конфигурации словарей
- Работа со словарями через API
- Прямой доступ к данным словарей
- Импорт данных
- Экспорт данных
Чтобы работать с данными словарей через API модуля dictionary, назначьте пользователю роль
dictionary_api_executor.
Это можно сделать в файле config.yml, используя опцию credentials.users.<username>.roles.
В примере ниже роль dictionary_api_executor задана пользователю dictionary_user:
credentials:users:dictionary_user:password: '123456'roles: [ dictionary_api_executor ]
Узнать больше об управлении пользователями и ролями можно в документации Tarantool.
Чтобы получить прямой доступ к данным словарей через спейс dictionary_data:
-
Назначьте пользователю роль
dictionary_api_executor. -
Выдайте пользователю права на чтение спейса
dictionary_dataи запись данных в него, используя опцию конфигурации credentials.users.<username>.privileges:credentials:users:dictionary_user:password: '123456'roles: [ dictionary_api_executor ]privileges:- permissions: [ read, write ]spaces: [ dictionary_data, dictionary_vclock ]- permissions: [ execute ]universe: true
В частности, такие права на чтение и запись необходимы для импорта и экспорта данных через утилиту tt CLI.
Когда доступ к данным для пользователя настроен, задайте в файле config.yml:
-
технологические роли
roles.dictionary-routerиroles.dictionary-storage. Их можно включить в секцияхgroups.routers.rolesиgroups.storages.rolesсоответственно (см. опцию roles). Пример:groups:routers:replication:failover: manualsharding:roles: [router]roles:- roles.crud-router- roles.metrics-export- roles.dictionary-router- roles.dictionary-storageУзнать больше: Включение и настройка ролей.
-
конфигурацию ролей
dictionaryдля роутера и хранилищ. Ее можно задать с помощью опции roles_cfg. Пример:roles_cfg:roles.dictionary-router:update_instances_list_period: 300roles.dictionary-storage:batch_size: 1000worker_sleep_in_second: 60update_instances_list_period: 300connect_timeout: 3Узнать больше про настройку конфигурации ролей можно в документации Tarantool в разделе Настройка ролей. Полный список поддерживаемых опций конфигурации
dictionaryприведен в разделе roles.dictionary-<router_or_storage>.
Для работы используются методы встроенного модуля dictionary.
Полный список поддерживаемых методов приведен в разделе Модуль dictionary.
Подробный пример работы со словарями через API приведен в разделе Запись и получение данных в словаре.
В примере ниже в словарь записывается элемент с помощью метода dictionary_set(). Затем записанные данные элемента словаря проверяются с помощью dictionary_get():
if dictionary_set('categories', '1', 'Food') thenlocal value = dictionary_get('categories', '1')end
В примере ниже работа со словарем выполняется в транзакции:
dictionary_set('categories', '1', {})box.begin()local data = dictionary_get('categories', '1')data.list= 'Food'if dictionary_set('categories', '1', data) thenbox.commit()dictionary_try_sync()elsebox.rollback()end
Данные словарей хранятся в спейсе dictionary_data.
Этот спейс содержит следующие поля:
entity_name— название словаря;key— идентификатор элемента словаря;value— данные элемента словаря.
Кроме того, спейс dictionary_data содержит служебные поля, которые автоматически рассчитываются перед записью.
Спейс dictionary_data можно использовать напрямую для записи и чтения данных, все изменения при этом будут переданы на другие узлы.
Удаление данных при работе напрямую с dictionary_data не поддерживаются.
В примере в спейс dictionary_data добавляется кортеж,
а затем записанные данные словаря проверяются и записываются в переменную value:
box.space.dictionary_data:replace({'categories', '1', 'Food'})local value = box.space.dictionary_data:get({'categories', '1'})
Данные словарей можно загрузить напрямую в спейс dictionary_data из файла .csv.
Для импорта требуются три поля:
entity_name— название словаря;key— идентификатор элемента словаря;value— данные элемента словаря.
Пример файла для импорта (import_example.csv):
entity_name,key,valuecategories,1,Foodcategories,2,Housecategories,3,Transportcategories,4,Clothescategories,5,Shoescategories,6,Giftscategories,7,Travel
Загрузить данные из файла можно в любой экземпляр с ролью roles.dictionary-storage, используя команду tt import:
tt import admin:test-cluster-cookie@localhost:3101 import_example.csv:dictionary_data --header
После загрузки данные распространяются по другим узлам за время, примерно равное значению опции dictionary.worker_sleep_in_second.
Команда tt import позволяет явно указать столбцы, которые нужно импортировать.
Это полезно в таких случаях:
- в загружаемом файле больше столбцов, чем нужно для загрузки;
- нужные столбцы имеют названия, отличные от названий полей (
entity_name,key,value). нужные.
Пример файла для импорта (test.csv), для которого потребуется явно указать столбцы:
csv_dict,csv_key,csv_value,writer_uid,dt,fingerprintcategories,1,Food,bbbbbbbb-0000-0000-0000-000000000001,1710759004038591461,36d105b8b513422c33677dd59d0be27ecategories,2,House,bbbbbbbb-0000-0000-0000-000000000001,1710759004039152609,6fb4851069662836519d660a7a59ed09categories,3,Transport,bbbbbbbb-0000-0000-0000-000000000001,1710759004039490086,dc6c35589f567f7683dfda8567949b5bcategories,4,Clothes,bbbbbbbb-0000-0000-0000-000000000001,1710759004039879589,c69658a6989824a428a2b01df21c2721categories,5,Shoes,bbbbbbbb-0000-0000-0000-000000000001,1710759004040017977,c149a6d5b1667c05c3853ee9f873b361categories,6,Gifts,bbbbbbbb-0000-0000-0000-000000000001,1710759004040344064,3b722413b54c323207e5f787cb5dc63ccategories,7,Travel,bbbbbbbb-0000-0000-0000-000000000001,1710759004040469779,135a471b56847a908ef5d0d1ff4c1244
Чтобы загрузить первые три столбца из файла выше (csv_dict,csv_key,csv_value), вызовите команду tt import с опцией --match:
tt import \admin:test-cluster-cookie@localhost:3101 \test.csv:dictionary_data \--header \--match "entity_name=csv_dict;key=csv_key;value=csv_value"
Выгрузить содержимое спейса dictionary_data можно с помощью команды tt export:
tt export admin:test-cluster-cookie@localhost:3101 dictionary_data:out.csv --header
Пример выгруженного файла out.csv:
entity_name,key,value,writer_uid,dt,fingerprintcategories,1,Food,bbbbbbbb-0000-0000-0000-000000000001,1710759004038591461,36d105b8b513422c33677dd59d0be27ecategories,2,House,bbbbbbbb-0000-0000-0000-000000000001,1710759004039152609,6fb4851069662836519d660a7a59ed09categories,3,Transport,bbbbbbbb-0000-0000-0000-000000000001,1710759004039490086,dc6c35589f567f7683dfda8567949b5bcategories,4,Clothes,bbbbbbbb-0000-0000-0000-000000000001,1710759004039879589,c69658a6989824a428a2b01df21c2721categories,5,Shoes,bbbbbbbb-0000-0000-0000-000000000001,1710759004040017977,c149a6d5b1667c05c3853ee9f873b361categories,6,Gifts,bbbbbbbb-0000-0000-0000-000000000001,1710759004040344064,3b722413b54c323207e5f787cb5dc63ccategories,7,Travel,bbbbbbbb-0000-0000-0000-000000000001,1710759004040469779,135a471b56847a908ef5d0d1ff4c1244