Описание схемы данных
В Tarantool использование схемы данных необязательно.
При создании спейса не обязательно определять схему данных. В этом случае кортежи хранят произвольные данные. Это правило не распространяется на индексированные поля. Такие поля должны содержать данные одного типа.
Схему данных можно определить при создании спейса. Подробнее см. в описании функции box.schema.space.create(). Если спейс уже создан без указания схемы данных, это можно сделать позже с помощью space_object:format().
После определения схемы данных все данные проверяются по типу. Перед любой вставкой или обновлением возникнет ошибка, если типы данных не совпадают.
Рекомендуется использовать схему данных, так как это помогает избежать ошибок.
В Tarantool схему данных можно определить двумя способами.
Файл с кодом обычно называется init.lua и содержит следующее описание
схемы:
box.cfg()users = box.schema.create_space('users', { if_not_exists = true })users:format({{ name = 'user_id', type = 'number'}, { name = 'fullname', type = 'string'}})users:create_index('pk', { parts = { { field = 'user_id', type = 'number'}}})
Это довольно просто: при запуске tarantool выполняет этот код и создает схему данных. Чтобы запустить этот файл, используйте:
tarantool init.lua
Однако это может показаться сложным, если вы не планируете глубоко изучать язык Lua и его синтаксис.
Возможная сложность: в приведенном выше фрагменте есть вызов функции с
двоеточием: users:format. Он используется для передачи переменной
users в качестве первого аргумента функции format. Это похоже на
self в объектно-ориентированных языках.
Поэтому может быть удобнее описать схему данных с помощью YAML.
Модуль DDL позволяет описывать схему данных в формате YAML декларативным способом.
Схема будет выглядеть примерно так:
spaces:users:engine: memtxis_local: falsetemporary: falseformat:- {name: user_id, type: uuid, is_nullable: false}- {name: fullname, type: string, is_nullable: false}- {name: bucket_id, type: unsigned, is_nullable: false}indexes:- name: user_idunique: trueparts: [{path: user_id, type: uuid, is_nullable: false}]type: HASH- name: bucket_idunique: falseparts: [{path: bucket_id, type: unsigned, is_nullable: false}]type: TREEsharding_key: [user_id]sharding_func: test_module.sharding_func
Этот вариант проще в использовании и не требует глубокого знания Lua.
Чтобы использовать модуль DDL, поместите следующий Lua-код в файл,
который используется для запуска Tarantool. Этот файл обычно называется
init.lua.
local yaml = require('yaml')local ddl = require('ddl')box.cfg{}local fh = io.open('ddl.yml', 'r')local schema = yaml.decode(fh:read('*all'))fh:close()local ok, err = ddl.check_schema(schema)if not ok thenprint(err)endlocal ok, err = ddl.set_schema(schema)if not ok thenprint(err)end