Работа с read view через модуль CRUD¶
Представления для чтения позволяют получать данные с помощью CRUD-операций read_view_object:select()
и read_view_object:pairs()
.
В этом руководстве описано, как с помощью модуля CRUD открыть представление для чтения,
получить данные из этого представления с помощью операций select
и pairs
, а затем закрыть его.
Подробные примеры использования операций select
и pairs
вместе с read view приведены в разделе Фильтрация и итерация в read view с помощью CRUD.
Для выполнения примеров из этого руководства требуется настроенный кластер с подготовленными данными. Чтобы подготовить стенд, используйте инструкцию из раздела Фильтрация и итерация в read view с помощью CRUD.
Руководство включает следующие шаги:
Создание представления для чтения¶
Чтобы создать read view, вызовите функцию crud.readview()
:
rv = crud.readview({ name = 'rv', timeout = 3 })
Здесь:
name
: название read view;timeout
: время ожиданияvshard.call
в секундах.
Фильтрация кортежей¶
Как и crud.select
, метод read_view_object:select()
рассматривает кластер как единый спейс и поддерживает
выбор с множественными условиями.
Получить выборку кортежей из спейса можно с помощью метода read_view_object:select()
.
В примере ниже возвращаются все кортежи спейса с помощью параметра fullscan
:
rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
- [ 2, 21401, 'Mary', 'Bowman', 46 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
..............
- [39, 6507, 'Oliver', 'Lowe', 39]
- [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...
Здесь:
customers
– название спейса;nil
– условия фильтрации кортежей;batch_size
– количество кортежей, которое будет обработано за раз запросом к хранилищу;fullscan
– полное сканирование спейса.
Теперь поменяйте данные в спейсе, вставив новый кортеж.
В спейсе уже есть кортеж с id = 8
, так что в конец будет добавлен новый кортеж с id = 41
:
crud.insert('customers', { 8, box.NULL, 'Elizabeth', 23 })
---
- rows:
- [ 41, 25201, 'Elizabeth', 'Born', 23 ]
metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
- null
...
Read view содержит снимок данных, полученный перед вставкой кортежа.
Чтобы проверить это, вызовите операцию select
еще раз:
rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
- [ 2, 21401, 'Mary', 'Bowman', 46 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
..............
- [39, 6507, 'Oliver', 'Lowe', 39]
- [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...
Действительно, в снимке нет нового кортежа с id = 41
.
Фильтрация с условием¶
Условия выборки для read_view_object:select()
совпадают с условиями crud.select
.
В примере ниже показано, как просмотреть пять первых покупателей, которым меньше или ровно 35 лет:
rv:select('customers', { { '<=', 'age', 35 } }, { first = 5 })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 5, 1172, 'Jack', 'Brown', 35 ]
- [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
- [ 16, 11089, 'Emma', 'Hodges', 33 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
- [ 36, 27087, 'Harper', 'Iqbal', 32 ]
- null
Здесь:
customers
– название спейса;{ '<=', 'age', 35 }
– условия фильтрации кортежей;first
– максимальное количество возвращаемых кортежей.
Итерация с помощью pairs¶
Для итерации по распределенному спейсу используется метод read_view_object:pairs().
В примере в таблицу записаны кортежи для первых пяти покупателей, которым меньше или ровно 35 лет:
tuples = {}
for _, tuple in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5}) do
table.insert(tuples, tuple)
end
tuples
Вывод выглядит так:
---
- - [ 5, 1172, 'Jack', 'Brown', 35 ]
- [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
- [ 16, 11089, 'Emma', 'Hodges', 33 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
- [ 36, 27087, 'Harper', 'Iqbal', 32 ]
...
Чтобы итерироваться по объектам или плоским кортежам, используйте параметр use_tomap
со значением true
.
В примере в таблицу записаны в виде объектов первые пять покупателей, которым меньше или ровно 35 лет:
objects = {}
for _, object in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5, use_tomap = true }) do
table.insert(objects, object)
end
objects
Вывод выглядит так:
---
- - bucket_id: 1172
id: 5
surname: Brown
age: 35
name: Jack
- bucket_id: 16559
id: 24
surname: Walmsley
age: 34
name: Ethan
- bucket_id: 11089
id: 16
surname: Hodges
age: 33
name: Emma
- bucket_id: 11804
id: 3
surname: Bradley
age: 33
name: David
- bucket_id: 27087
id: 36
surname: Iqbal
age: 32
name: Harper
...
Закрытие read view¶
Представления для чтения могут занимать значительный объем памяти. Если read view больше не требуется, закройте его с помощью метода read_view_object:close():
rv:close({ timeout = 3 })
Здесь:
timeout
: время ожиданияvshard.call
в секундах.
Если не закрыть read view таким образом, он закроется неявно, когда сборщик мусора Lua соберет объект read view.
После закрытия read view его статус меняется на closed
.
Попытка использовать закрытый read view вызовет ошибку.