Как вставить в Tarantool таблицу LUA с ключом и значением? - PullRequest
1 голос
/ 29 мая 2020

У меня есть строка JSON:

{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
    "geohash64" : 5637765837143565,
    "mime_type" : "image/jpg"
}

И я преобразовал ее в Lua Таблицу с помощью модуля Tarantool json:

table = json.decode(JSONstring)

Тогда я хочу вставьте таблицу в Tarantool с ID = 1

box.space.somespace:insert{1, table}

Когда я выбираю таблицу, добавленную в базу данных Tarantool в форме JSON, результат будет таким:

Нет доступа значения через ключ

Я могу получить доступ только к таблице [1] и таблице [2]: таблица [1] - это идентификатор = 1, а таблица [2] - это вся строка JSON. Это означает, что я не могу получить доступ к значениям JSON с помощью ключей: table ['entry_offset'], table ['entry_size'], .... вернуть nil, когда я пытаюсь получить к ним доступ

Итак, как мне вставить таблицу Lua в Tarantool, а затем получить доступ к значениям с помощью ее ключей?

Спасибо за помощь !!!

1 Ответ

2 голосов
/ 29 мая 2020

Вы в основном вставляете в пространство кортеж, а не сам объект table, поэтому, когда вы делаете:

obj = box.space.somespace:get{1}

, вы получаете обратно свой кортеж, а не table. Тем не менее, если вы хотите получить доступ к полям table с помощью ключей, вам просто нужно проиндексировать этот объект следующим образом:

table = obj[2]
print(table.entry_offset)

Как только вы привыкнете к нему, проверьте tarantool space format Функция с функциями tomap / frommap. Вот пример основного c, который может вам помочь:

box.cfg{}
box.schema.create_space('test', {if_not_exists = true})
box.space.test:create_index('pk', {unique = true, if_not_exists = true, parts = {1, 'unsigned'}})
box.space.test:format({
    { name = 'id', 'unsigned' },
    { name = 'entry_offset', 'unsigned' },
    { name = 'entry_size', 'unsigned' },
    { name = 'created_time', 'unsigned' },
    { name = 'additional_meta', 'map' },
})

json = require('json')
obj_json = [[{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
    "geohash64" : 5637765837143565,
    "mime_type" : "image/jpg"
}}]]
obj = json.decode(obj_json)
obj.id = 1

tuple = box.space.test:frommap(obj)
box.space.test:insert(tuple)
result = box.space.test:get({1}):tomap()

print(result.additional_meta.mime_type)

Или, для более продвинутого подхода к сериализации, взгляните на avro-schema с его flatten / unflatten методов. Примеры есть в README

...