如何从tarantool中选择数量有限的记录,例如在SQL中使用SELECT LIMIT?

时间:2019-06-13 15:37:36

标签: sql tarantool

我想使用过滤和限制结果在Tarantool空间上执行选择,就像我可以使用简单的SQL查询一样 “ SELECT * FROM users WHERE age > 33 LIMIT 1”。 我该如何实现?

1 个答案:

答案 0 :(得分:4)

可以使用Lua和SQL来完成。

1)这是Lua中的示例。假设我们有一个名为“用户”的空间,其字段为“名称”,“姓氏”,“年龄”。首先,让我们创建并填充空间:

$ tarantool
Tarantool 2.1.1-465-gbd1a43fbc
type 'help' for interactive help
tarantool> box.cfg({})
...
2019-06-10 14:51:33.827 [47393] main/102/interactive I> ready to accept requests
...
2019-06-10 14:51:33.827 [47393] main/104/checkpoint_daemon I> scheduled next checkpoint for Mon Jun 10 16:14:44 2019
---
...

tarantool> s = box.schema.space.create('users', {temporary=true})
---
...

tarantool> box.space.users:format({{'id','unsigned'},{'name','string'},{'surname','string'},{'age','unsigned'}})
---
...

tarantool> s:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
---
- unique: true
  parts:
  - type: unsigned
    is_nullable: false
    fieldno: 1
  id: 0
  space_id: 512
  name: primary
  type: TREE
...

tarantool> s:insert({1,'Pasha','Yudin',33})
---
- [1, 'Pasha', 'Yudin', 33]
...

tarantool> s:insert({3,'Kostya','Nazarov',34})
---
- [2, 'Kostya', 'Nazarov', 34]
...

tarantool> s:insert({2,'Oleg','Babin',23})
---
- [3, 'Oleg', 'Babin', 23]
...

tarantool> s:insert({4,'Roma','Babaev',34})
---
- [4, 'Roma', 'Babaev', 34]
...

让我们从该空间中选择所有记录:

tarantool> s:select()
---
- - [1, 'Pasha', 'Yudin', 33]
  - [2, 'Kostya', 'Nazarov', 23]
  - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

接下来,让我们选择所有33岁以上的用户。可以使用LuaFun库:

tarantool> fun = require('fun')
---
...

tarantool> fun.iter(s:select()):filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

但是正如下面的@AlexanderTurenko所提到的,最好使用pairs迭代器,以免将多余的元组加载到内存中。

tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

此外,此变体更短,更易读。

最后,让我们仅选择一个满足我们条件的用户,这等效于SQL查询“ SELECT * FROM users WHERE age > 33 LIMIT 1”:

tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):take_n(1):totable()
---
- - [3, 'Oleg', 'Babin', 34]
...

2)从Tarantool 2.0开始,可以using SQL完成此操作(前提是您具有空格格式):

box.execute('select * from users where age > 33 limit 1;')