delete() из скрипта, а интерпретатор дает другой результат. Почему?

Функция из скрипта:

function test_delete(val)
    local result = box.space.upbx_test_redirections.index.name_index:delete(val)
    return result
end

Я получаю: "message":"Get() doesn't support partial keys and non-unique indexes". Если я звоню из интерпретатора, все ок, я получаю кортеж. Опции мой индекс

name_index:   3: &3
    unique: true
    parts:
    - type: string
      is_nullable: false
      fieldno: 4
    id: 3
    type: TREE
    space_id: 517
    name: name_index
  bucket_id: *1
  index_name: *3
  ID: *0
  secondary: *2

значение для теста: 1234567890abcdefghijkl0987654321_uuid

Код для создания пространства:

local upbx_test_redirections = box.schema.space.create(
        "upbx_test_redirections", 
        {
            format = {
                {"ID", "integer"},
                {"bucket_id", "unsigned"}, 
                {"test1", "string"},
                {"test2", "string"},
                {"test3", "string"},
                {"test4", "string"},
                {"test5", "string"},
                {"test6", "string"},
                {"test7", "string"},
                {"test8", "string"},
                {"test9", "integer"},
                {"test10", "integer"},
            },
            if_not_exists = true,
        }
    )

и индекс:

upbx_test_redirections:create_index(
    "name_index", 
    {
        parts = {"test2"}, 
        unique = true, 
        if_not_exists = true, 
    }
)

Решение: необходимо изменить во всех случаях.


person Aleksey Budaev    schedule 28.09.2020    source источник


Ответы (1)


Я бы порекомендовал вам еще раз пересмотреть вашу схему. Моя гипотеза - ранее вы создали неуникальный индекс, а затем просто изменили unique=false на unique=true.

tarantool> upbx_test_redirections:create_index(
         >     "name_index",
         >     {
         >         parts = {"test2"},
         >         unique = false,
         >         if_not_exists = true,
         >     }
         > )
---
- unique: false
  parts:
  - type: string
    is_nullable: false
    fieldno: 4
  id: 1
  space_id: 512
  type: TREE
  name: name_index
...

tarantool> upbx_test_redirections:create_index(
         >     "name_index",
         >     {
         >         parts = {"test2"},
         >         unique = true,
         >         if_not_exists = true,
         >     }
         > )
---
- unique: false    -- unique option isn't changed
  parts:
  - type: string
    is_nullable: false
    fieldno: 4
  id: 1
  space_id: 512
  type: TREE
  name: name_index
- not created
...

Посмотрите мой пример с ошибками, с которыми вы могли столкнуться.

box.cfg{}
s = box.schema.space.create('test')
s:format({{name = 'id', type = 'unsigned'}, {name = 'value', type = 'string'}})
-- Unique primary index
s:create_index('pk', {unique = true, parts = {{field = 'id', is_nullable = false}}})
-- Unique secondary index
s:create_index('sk', {unique = true, parts = {{field = 'value', is_nullable = false}}})
-- Unique multipart index
s:create_index('multipart', {unique = true, parts = {{field = 'id', is_nullable = false}, {field = 'value', is_nullable = false}}})
-- Non-unique multipart indexes
s:create_index('multipart_non_unique', {unique = false, parts = {{field = 'id', is_nullable = false}, {field = 'value', is_nullable = false}}})

-- Test data
s:replace{1, '1'}
s:replace{2, '2'}
s:replace{3, '3'}
s:replace{4, '4'}
s:replace{5, '5'}

-- Examples with errors
box.space.test:delete({1}) -- OK
box.space.test.index['pk']:delete({2}) -- OK
box.space.test.index['pk']:delete(2) -- OK
box.space.test.index['pk']:delete(nil) -- Fail
box.space.test.index['sk']:delete('3') -- OK
box.space.test.index['sk']:delete({'3'}) -- OK
box.space.test.index['multipart']:delete({4}) -- Fail: Invalid key part count in an exact match (expected 2, got 1)
box.space.test.index['multipart']:delete({4, '4'}) -- OK
box.space.test.index['multipart_non_unique']:delete({5}) -- Fail: Get() doesn't support partial keys and non-unique indexes
box.space.test.index['multipart_non_unique']:delete({5, '5'}) -- Fail: Get() doesn't support partial keys and non-unique indexes

Если проблема все еще существует, не стесняйтесь сообщить об ошибке

person Oleg Babin    schedule 28.09.2020
comment
Это не ошибка. Если вы попытаетесь воссоздать существующий индекс с параметром if_not_exists=true, Tarantool ничего не сделает, если он уже существует. Его следует изменить с помощью index:alter({unique = true}) - person Oleg Babin; 28.09.2020