如何使用键和值将 LUA Table 插入到 Tarantool?
How to insert a LUA Table to Tarantool with Key and Value?
我有一个 JSON 字符串:
{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
"geohash64" : 5637765837143565,
"mime_type" : "image/jpg"
}
我已经使用 Tarantool 的模块将其转换为 Lua Table json:
table = json.decode(JSONstring)
然后我想将 table 插入 ID = 1
的 Tarantool
box.space.somespace:insert{1, table}
当我 select 以 JSON 形式添加到 Tarantool 数据库的 table 时,结果是这样的:
Cannot access values through key
我只能访问table[1]和table[2]:table[1]是ID = 1,而table[2]是所有 JSON 字符串。这意味着我无法使用键访问 JSON 的值:table['entry_offset']、table['entry_size']、....
return 当我尝试访问它们时为零
那么如何将 Lua table 插入 Tarantool 然后通过它的键访问值?
谢谢你的帮助!!!
您基本上是在 space 中插入一个包装元组,而不是 table
对象本身,所以当您这样做时:
obj = box.space.somespace:get{1}
你得到了你的元组,而不是 table
。也就是说,如果您想使用键访问 table
的字段,您只需要像这样索引该对象:
table = obj[2]
print(table.entry_offset)
一旦您习惯了它,请查看 tarantool space format 功能及其 tomap
/frommap
功能。这是基本示例,可能对您有所帮助:
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 with its flatten
/unflatten
methods. There are examples in README
我有一个 JSON 字符串:
{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
"geohash64" : 5637765837143565,
"mime_type" : "image/jpg"
}
我已经使用 Tarantool 的模块将其转换为 Lua Table json:
table = json.decode(JSONstring)
然后我想将 table 插入 ID = 1
的 Tarantoolbox.space.somespace:insert{1, table}
当我 select 以 JSON 形式添加到 Tarantool 数据库的 table 时,结果是这样的:
Cannot access values through key
我只能访问table[1]和table[2]:table[1]是ID = 1,而table[2]是所有 JSON 字符串。这意味着我无法使用键访问 JSON 的值:table['entry_offset']、table['entry_size']、.... return 当我尝试访问它们时为零
那么如何将 Lua table 插入 Tarantool 然后通过它的键访问值?
谢谢你的帮助!!!
您基本上是在 space 中插入一个包装元组,而不是 table
对象本身,所以当您这样做时:
obj = box.space.somespace:get{1}
你得到了你的元组,而不是 table
。也就是说,如果您想使用键访问 table
的字段,您只需要像这样索引该对象:
table = obj[2]
print(table.entry_offset)
一旦您习惯了它,请查看 tarantool space format 功能及其 tomap
/frommap
功能。这是基本示例,可能对您有所帮助:
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 with its flatten
/unflatten
methods. There are examples in README