Spec-Zone.ru › RethinkDB python

Команда ReQL: do

Синтаксис команды

any.do(function) → any
r.do([args]*, function) → any
any.do(expr) → any
r.do([args]*, expr) → any

Описание

Вызов анонимной функции с использованием возвращаемых значений других команд или запросов ReQL в качестве аргументов.

Последний аргумент к do (или, в некоторых формах, единственный аргумент) — это выражение или анонимная функция, которая получает значения либо от предыдущих аргументов, либо от команд, предварительно связанных цепочкой перед do. Команда do по сути представляет собой одноэлементную map, позволяющую применить функцию к одному документу. Это позволяет привязать результат запроса к локальной переменной в рамках области видимости do, позволяя вычислить результат один раз и повторно использовать его в сложном выражении или в ряду команд ReQL.

Аргументы, передаваемые функции do должны быть базовыми типами данных и не могут быть потоками или выборками. (Подробнее об типах данных ReQL.) Хотя все аргументы будут оценены до выполнения функции, они могут быть оценены в любом порядке, поэтому их значения не должны зависеть друг от друга. Тип результата do — это тип значения, возвращаемого функцией или последним выражением.

Пример: Вычисление чистого счета гольфиста за игру.

r.table('players').get('86be93eb-a112-48f5-a829-15b2cb49de1d').do(
    lambda player: player['gross_score'] - player['course_handicap']
).run(conn)

Пример: Возврат имени лучшего игрока с наивысшим результатом в матче по гольфу на двоих.

r.do(r.table('players').get(id1), r.table('players').get(id2),
    (lambda player1, player2:
        r.branch(player1['gross_score'].lt(player2['gross_score']),
        player1, player2))
).run(conn)

Обратите внимание, что branch, команда условного выполнения ReQL, должна использоваться вместо if. См. branch документацию для получения более подробной информации.

Пример: Выполнение различных действий в зависимости от результата команды ReQL insert.

new_data = {
    'id': 100,
    'name': 'Agatha',
    'gross_score': 57,
    'course_handicap': 4
}
r.table('players').insert(new_data).do(lambda doc:
    r.branch((doc['inserted'] != 0),
        r.table('log').insert({'time': r.now(), 'response': doc, 'result': 'ok'}),
        r.table('log').insert({'time': r.now(), 'response': doc, 'result': 'error'}))
).run(conn)

Связанные команды

  • map

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/python/do/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API