我如何一次 select 来自 tarantool 的多个键,例如 SELECT IN in SQL?
How do I select several keys from tarantool at once, like with SELECT IN in SQL?
我想 select 一次调用 Tarantool 的多条记录,但不知道如何将多个键传递给 space:get
或 space:select
您可以使用 Lua 以及 SQL。
1) 在Lua中使用存储过程,例如:
function select_several(space_name, index_name, keys)
local obj = index_name == nil and box.space[space_name] or box.space[space_name].index[index_name]
local result = {}
for _, key in pairs(keys) do
table.insert(result, obj:get(key))
end
return result
end
...
select_several('test', nil, {1, 2})
2)从Tarantool 2.0开始,可以使用SQL(前提是你有space格式):
box.execute('select * from "test" where "id" in (1, 3);')
另一个变体相当于 SQL 查询 select * from "test" where "id" in (1, 3)
使用 LuaFun:
tarantool> box.space.test:pairs():filter(function (tuple) return tuple.id == 1 or tuple.id == 3 end):totable()
如果space中没有'id'索引,则为通用变体,意味着执行全扫描。
如果存在名为 "id" 的唯一索引,则可以使用更高效的变体:
tarantool> fun.iter({1, 3}):map(function (value) return box.space.test.id:get(value) end):totable()
否则如果索引不是唯一的,那么它看起来像
tarantool> fun.iter({1, 3}):map(function (value) return box.space.test.id:select(value) end):reduce(function (result, data) for _, rec in ipairs(data) do table.insert(result, rec) end return result end, {})
我想 select 一次调用 Tarantool 的多条记录,但不知道如何将多个键传递给 space:get
或 space:select
您可以使用 Lua 以及 SQL。
1) 在Lua中使用存储过程,例如:
function select_several(space_name, index_name, keys)
local obj = index_name == nil and box.space[space_name] or box.space[space_name].index[index_name]
local result = {}
for _, key in pairs(keys) do
table.insert(result, obj:get(key))
end
return result
end
...
select_several('test', nil, {1, 2})
2)从Tarantool 2.0开始,可以使用SQL(前提是你有space格式):
box.execute('select * from "test" where "id" in (1, 3);')
另一个变体相当于 SQL 查询 select * from "test" where "id" in (1, 3)
使用 LuaFun:
tarantool> box.space.test:pairs():filter(function (tuple) return tuple.id == 1 or tuple.id == 3 end):totable()
如果space中没有'id'索引,则为通用变体,意味着执行全扫描。
如果存在名为 "id" 的唯一索引,则可以使用更高效的变体:
tarantool> fun.iter({1, 3}):map(function (value) return box.space.test.id:get(value) end):totable()
否则如果索引不是唯一的,那么它看起来像
tarantool> fun.iter({1, 3}):map(function (value) return box.space.test.id:select(value) end):reduce(function (result, data) for _, rec in ipairs(data) do table.insert(result, rec) end return result end, {})