Описание схемы данных
В 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: memtx
is_local: false
temporary: false
format:
- {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_id
unique: true
parts: [{path: user_id, type: uuid, is_nullable: false}]
type: HASH
- name: bucket_id
unique: false
parts: [{path: bucket_id, type: unsigned, is_nullable: false}]
type: TREE
sharding_key: [user_id]
sharding_func: test_module.sharding_func
Этот вариант проще для старта: его проще использовать и не нужно вникать в язык Lua.
To use the DDL module, put the following Lua code into the file that you use to run Tarantool.
This file is usually called 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 then
print(err)
end
local ok, err = ddl.set_schema(schema)
if not ok then
print(err)
end
Предупреждение
Менять схему в самом DDL после ее применения нельзя. Для миграций есть несколько подходов — они описаны в разделе Миграции.