Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Описание схемы данных

В 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

Модуль 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.

Чтобы использовать модуль 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 then    print(err)endlocal ok, err = ddl.set_schema(schema)if not ok then    print(err)end