Spec-Zone.ru › RethinkDB python

Справочник по командам Python ReQL

Ищете документацию по драйверу сообщества?
Найдите страницу проекта для вашего драйвера для получения конкретной документации по ReQL.

Доступ к ReQL

r

r → r

Пространство имен ReQL верхнего уровня.

Пример: Настройка пространства имен верхнего уровня.

from rethinkdb import RethinkDB
r = RethinkDB()

Подробнее об этой команде →

connect

r.connect(options) → connection

Создать новое подключение к серверу базы данных. Параметры ключевых слов:

  • host: хост экземпляра RethinkDB. Значение по умолчанию — localhost.
  • port: порт драйвера, по умолчанию 28015.
  • db: база данных, используемая, если явно не указана в запросе, по умолчанию test.
  • user: учетная запись пользователя для подключения (по умолчанию admin).
  • password: пароль для учетной записи пользователя для подключения (по умолчанию '', пустое).
  • timeout: время ожидания в секундах для открытия подключения (по умолчанию 20).
  • ssl: хеш опций для поддержки SSL-соединений (по умолчанию None). В настоящее время доступна только одна опция, и если указана опция ssl, этот ключ необходим:
    • ca_certs: путь к сертификату SSL CA.

Если подключение не может быть установлено, будет выброшено исключение ReqlDriverError.

Пример: Открыть подключение, используя хост и порт по умолчанию, указав базу данных по умолчанию.

conn = r.connect(db='marvel')

Подробнее об этой команде →

repl

conn.repl()

Установить подключение по умолчанию для упрощения использования REPL. Позволяет вызывать .run() для запросов без указания подключения.

Пример: Установить подключение по умолчанию для REPL, а затем вызвать run() без указания подключения.

r.connect(db='marvel').repl()
r.table('heroes').run()

Подробнее об этой команде →

close

conn.close(noreply_wait=True)

Закрыть открытое подключение.

Пример: Закрыть открытое подключение, ожидая завершения запросов noreply.

conn.close()

Подробнее об этой команде →

reconnect

conn.reconnect(noreply_wait=True)

Закрыть и открыть заново подключение.

Пример: Отменить незавершенные запросы/запросы, которые больше не нужны.

conn.reconnect(noreply_wait=False)

Подробнее об этой команде →

use

conn.use(db_name)

Изменить базу данных по умолчанию для этого подключения.

Пример: Изменить базу данных по умолчанию, чтобы нам не нужно было указывать базу данных при ссылке на таблицу.

conn.use('marvel')
r.table('heroes').run(conn) # refers to r.db('marvel').table('heroes')

Подробнее об этой команде →

run

query.run(conn[, options]) → cursor
query.run(conn[, options]) → object

Выполнить запрос на подключении, вернув либо единственный результат JSON, либо курсор, в зависимости от запроса.

Пример: Выполнить запрос на подключении conn и вывести каждую строку в результате.

for doc in r.table('marvel').run(conn):
    print doc

Подробнее об этой команде →

changes

stream.changes([options]) → stream
singleSelection.changes([options]) → stream

Преобразовать запрос в changefeed, бесконечный поток объектов, представляющих изменения в результатах запроса по мере их возникновения. Changefeed может возвращать изменения в таблице или в отдельном документе (changefeed «точки»). Команды, такие как filter или map, могут использоваться перед командой changes для преобразования или фильтрации вывода, и многие команды, работающие с последовательностями, могут быть объединены после changes.

Пример: Подписаться на изменения в таблице.

Начать мониторинг changefeed в одном клиенте:

for change in r.table('games').changes().run(conn):
  print change

По мере выполнения этих запросов во втором клиенте, первый клиент будет получать и выводить следующие объекты:

> r.table('games').insert({'id': 1}).run(conn)
{'old_val': None, 'new_val': {'id': 1}}

> r.table('games').get(1).update({'player1': 'Bob'}).run(conn)
{'old_val': {'id': 1}, 'new_val': {'id': 1, 'player1': 'Bob'}}

> r.table('games').get(1).replace({'id': 1, 'player1': 'Bob', 'player2': 'Alice'}).run(conn)
{'old_val': {'id': 1, 'player1': 'Bob'},
 'new_val': {'id': 1, 'player1': 'Bob', 'player2': 'Alice'}}

> r.table('games').get(1).delete().run(conn)
{'old_val': {'id': 1, 'player1': 'Bob', 'player2': 'Alice'}, 'new_val': None}

> r.table_drop('games').run(conn)
ReqlRuntimeError: Changefeed aborted (table unavailable)

Подробнее об этой команде →

noreply_wait

conn.noreply_wait()

noreply_wait гарантирует, что предыдущие запросы с флагом noreply были обработаны сервером. Обратите внимание, что эта гарантия применима только к запросам, выполненным на данном подключении.

Пример: Мы ранее выполняли запросы с аргументом noreply установленным в True. Теперь подождите, пока сервер обработает их.

conn.noreply_wait()

Подробнее об этой команде →

server

conn.server()

Возвращает информацию о сервере, используемом подключением.

Пример: Возвращение информации о сервере.

> conn.server()

{
    "id": "404bef53-4b2c-433f-9184-bc3f7bda4a15",
    "name": "amadeus",
    "proxy": False
}

Подробнее об этой команде →

set_loop_type

r.set_loop_type(string)

Установить модель асинхронной событийной петли. Поддерживаются две модели:

Пример: Чтение данных таблицы с использованием Tornado.

r.set_loop_type("tornado")
conn = r.connect(host='localhost', port=28015)

@gen.coroutine
def use_cursor(conn):
    # Print every row in the table.
    cursor = yield r.table('test').order_by(index="id").run(yield conn)
    while (yield cursor.fetch_next()):
        item = yield cursor.next()
        print(item)

Более подробная информация с примерами Tornado и Twisted доступна в статье документации по асинхронным подключениям.

Подробнее об этой команде →

Курсоры

next

cursor.next([wait=True])

Получить следующий элемент в курсоре.

Пример: Получить следующий элемент.

cursor = r.table('superheroes').run(conn)
doc = cursor.next()

Подробнее об этой команде →

for

for items in cursor:
for items in array:
for items in feed:

Ленивая итерация по набору результатов по одному элементу за раз.

Пример: Обработаем все элементы!

cursor = r.table('users').run(conn)
for doc in cursor:
    process_row(doc)

Подробнее об этой команде →

list

list(cursor)

Получить все результаты в виде списка.

Пример: Для небольших наборов результатов может быть удобнее обрабатывать их сразу в виде массива.

cursor = r.table('users').run()
users = list(cursor)
process_results(users)

Подробнее об этой команде →

close

cursor.close()

Закрыть курсор. Закрытие курсора отменяет соответствующий запрос и освобождает память, связанную с открытым запросом.

Пример: Закрыть курсор.

cursor.close()

Подробнее об этой команде →

Управление базами данных

db_create

r.db_create(db_name) → object

Создать базу данных. База данных RethinkDB — это набор таблиц, аналогично реляционным базам данных.

Пример: Создать базу данных с именем «superheroes».

r.db_create('superheroes').run(conn)

{
    "config_changes": [
        {
            "new_val": {
                "id": "e4689cfc-e903-4532-a0e6-2d6797a43f07",
                "name": "superheroes"
            },
            "old_val": None
        }
    ],
    "dbs_created": 1
}

Подробнее об этой команде →

db_drop

r.db_drop(db_name) → object

Удалить базу данных. База данных, все её таблицы и соответствующие данные будут удалены.

Пример: Удалить базу данных с именем «superheroes».

r.db_drop('superheroes').run(conn)

{
    "config_changes": [
        {
            "old_val": {
                "id": "e4689cfc-e903-4532-a0e6-2d6797a43f07",
                "name": "superheroes"
            },
            "new_val": None
        }
    ],
    "tables_dropped": 3,
    "dbs_dropped": 1
}

Подробнее об этой команде →

db_list

r.db_list() → array

Список всех имен баз данных в системе. Результат — список строк.

Пример: Список всех баз данных.

r.db_list().run(conn)

Подробнее об этой команде →

END_OF_DOCUMENT_MARKER

Обработка таблиц

table_create

db.table_create(table_name[, options]) → object
r.table_create(table_name[, options]) → object

Создайте таблицу. Таблица RethinkDB — это набор JSON-документов.

Пример: Создайте таблицу с именем ‘dc_universe’ с настройками по умолчанию.

r.db('heroes').table_create('dc_universe').run(conn)

{
    "config_changes": [
        {
            "new_val": {
                "db": "test",
                "durability":  "hard",
                "id": "20ea60d4-3b76-4817-8828-98a236df0297",
                "name": "dc_universe",
                "primary_key": "id",
                "shards": [
                    {
                        "primary_replica": "rethinkdb_srv1",
                        "replicas": [
                            "rethinkdb_srv1",
                            "rethinkdb_srv2"
                        ]
                    }
                ],
                "write_acks": "majority"
            },
            "old_val": None
        }
    ],
    "tables_created": 1
}

Подробнее об этой команде →

table_drop

db.table_drop(table_name) → object

Удалите таблицу. Таблица и все данные в ней будут удалены.

Пример: Удалите таблицу с именем ‘dc_universe’.

r.db('test').table_drop('dc_universe').run(conn)

{
    "config_changes": [
        {
            "old_val": {
                "db": "test",
                "durability":  "hard",
                "id": "20ea60d4-3b76-4817-8828-98a236df0297",
                "name": "dc_universe",
                "primary_key": "id",
                "shards": [
                    {
                        "primary_replica": "rethinkdb_srv1",
                        "replicas": [
                            "rethinkdb_srv1",
                            "rethinkdb_srv2"
                        ]
                    }
                ],
                "write_acks": "majority"
            },
            "new_val": None
        }
    ],
    "tables_dropped": 1
}

Подробнее об этой команде →

table_list

db.table_list() → array

Список всех имён таблиц в базе данных. Результатом является список строк.

Пример: Список всех таблиц в базе данных ‘test’.

r.db('test').table_list().run(conn)

Подробнее об этой команде →

index_create

table.index_create(index_name[, index_function][, multi=False, geo=False]) → object

Создайте новый вторичный индекс в таблице. Вторичные индексы повышают скорость многих запросов на чтение с небольшой потерей места в хранилище и снижением производительности записи. Для получения дополнительной информации о вторичных индексах прочитайте статью «Использование вторичных индексов в RethinkDB».

Пример: Создайте простой индекс, основанный на поле post_id.

r.table('comments').index_create('post_id').run(conn)

Подробнее об этой команде →

index_drop

table.index_drop(index_name) → object

Удалить ранее созданный вторичный индекс этой таблицы.

Пример: Удалить вторичный индекс с именем ‘code_name’.

r.table('dc').index_drop('code_name').run(conn)

Подробнее об этой команде →

index_list

table.index_list() → array

Список всех вторичных индексов этой таблицы.

Пример: Список доступных вторичных индексов для этой таблицы.

r.table('marvel').index_list().run(conn)

Подробнее об этой команде →

index_rename

table.index_rename(old_index_name, new_index_name[, overwrite=False]) → object

Переименовать существующий вторичный индекс в таблице. Если необязательный аргумент overwrite задан как True, ранее существовавший индекс с новым именем будет удалён, и индекс будет переименован. Если overwrite равно False (по умолчанию), произойдёт ошибка, если индекс с новым именем уже существует.

Пример: Переименование индекса в таблице комментариев.

r.table('comments').index_rename('post_id', 'message_id').run(conn)

Подробнее об этой команде →

index_status

table.index_status([, index...]) → array

Получить статус указанных индексов в этой таблице или статус всех индексов в этой таблице, если индексы не указаны.

Пример: Получить статус всех индексов в test:

r.table('test').index_status().run(conn)

Подробнее об этой команде →

index_wait

table.index_wait([, index...]) → array

Дождаться готовности указанных индексов в этой таблице или готовности всех индексов в этой таблице, если индексы не указаны.

Пример: Дождаться готовности всех индексов в таблице test:

r.table('test').index_wait().run(conn)

Подробнее об этой команде →

[set_write_hook(set_write_hook/)

table.set_write_hook(function | binary | null) → object

Устанавливает обработчик записи в таблице или перезаписывает его, если он уже существует.

Обработчик записи может быть анонимной функцией с сигнатурой (context: object, old_val: object, new_val: object) -> object или двоичным представлением, полученным из поля function из get_write_hook. Функция должна быть детерминированной и не может использовать подзапрос или команду r.js.

Подробнее об этой команде →

getWriteHook

table.get_write_hook() → null/object

Получить обработчик записи для этой таблицы. Если обработчик записи существует, результат — объект следующего формата:

{
  "function": <binary>,
  "query": "setWriteHook(function(_var1, _var2, _var3) { return ...; })",
}

Подробнее об этой команде →

Запись данных

insert

table.insert(object | [object1, object2, ...][, durability="hard", return_changes=False, conflict="error"]) → object

Вставить документы в таблицу. Принимает один документ или массив документов.

Пример: Вставка документа в таблицу posts.

r.table("posts").insert({
    "id": 1,
    "title": "Lorem ipsum",
    "content": "Dolor sit amet"
}).run(conn)

Подробнее об этой команде →

update

table.update(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object
selection.update(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object
singleSelection.update(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object

Обновить JSON-документы в таблице. Принимает JSON-документ, выражение ReQL или их комбинацию.

Пример: Обновить статус записи с id от 1 до published.

r.table("posts").get(1).update({"status": "published"}).run(conn)

Подробнее об этой команде →

replace

table.replace(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object
selection.replace(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object
singleSelection.replace(object | function[, durability="hard", return_changes=False, non_atomic=False]) → object

Заменить документы в таблице. Принимает JSON-документ или выражение ReQL и заменяет исходный документ новым. Новый документ должен иметь тот же первичный ключ, что и исходный.

Пример: Заменить документ с первичным ключом 1.

r.table("posts").get(1).replace({
    "id": 1,
    "title": "Lorem ipsum",
    "content": "Aleas jacta est",
    "status": "draft"
}).run(conn)

Подробнее об этой команде →

delete

table.delete([durability="hard", return_changes=False]) → object
selection.delete([durability="hard", return_changes=False]) → object
singleSelection.delete([durability="hard", return_changes=False]) → object

Удалить один или несколько документов из таблицы.

Пример: Удалить один документ из таблицы comments.

r.table("comments").get("7eab9e63-73f1-4f33-8ce4-95cbea626f59").delete().run(conn)

Подробнее об этой команде →

sync

table.sync() → object

sync гарантирует, что записи в заданной таблице записываются в постоянное хранилище. Запросы, которые задают мягкую устойчивость (durability='soft'), не дают таких гарантий, поэтому sync можно использовать для обеспечения состояния этих запросов. Вызов sync не возвращает результат, пока все предыдущие записи в таблицу не будут сохранены.

Пример: После обновления нескольких героев с мягкой устойчивостью мы теперь хотим подождать, пока эти изменения не будут сохранены.

r.table('marvel').sync().run(conn)

Подробнее об этой команде →

Выбор данных

db

r.db(db_name) → db

Ссылка на базу данных.

Пример: Явно указывается база данных для запроса.

r.db('heroes').table('marvel').run(conn)

Подробнее об этой команде →

table

db.table(name[, read_mode='single', identifier_format='name']) → table

Возвращает все документы в таблице. После этой команды можно применить другие команды table, чтобы вернуть подмножество документов (такие как get и filter) или выполнить дальнейшую обработку.

Пример: Возвращает все документы в таблице ‘marvel’ из базы данных по умолчанию.

r.table('marvel').run(conn)

Подробнее об этой команде →

get

table.get(key) → singleRowSelection

Получение документа по первичному ключу.

Пример: Нахождение документа по UUID.

r.table('posts').get('a9849eef-7176-4411-935b-79a6e3c56a74').run(conn)

Подробнее об этой команде →

get_all

table.get_all([key1, key2...], [, index='id']) → selection

Получение всех документов, где заданное значение совпадает со значением запрошенного индекса.

Пример: Ключи вторичных индексов не гарантированно уникальны, поэтому для запроса при использовании вторичного индекса нельзя использовать get.

r.table('marvel').get_all('man_of_steel', index='code_name').run(conn)

Подробнее об этой команде →

between

table.between(lower_key, upper_key[, options]) → table_slice
table_slice.between(lower_key, upper_key[, options]) → table_slice

Получение всех документов между двумя ключами. Принимает три необязательных аргумента: index, left_bound, и right_bound. Если index установлено в имя вторичного индекса, between вернет все документы, где значение этого индекса находится в указанном диапазоне (по умолчанию используется первичный ключ). left_bound или right_bound можно установить в open или closed, чтобы указать, включать или не включать конец диапазона (по умолчанию left_bound закрыт, а right_bound открыт).

Пример: Найти всех пользователей с первичным ключом ≥ 10 и < 20 (обычный полуоткрытый интервал).

r.table('marvel').between(10, 20).run(conn)

Подробнее об этой команде →

filter

selection.filter(predicate_function[, default=False]) → selection
stream.filter(predicate_function[, default=False]) → stream
array.filter(predicate_function[, default=False]) → array

Возвращает все элементы в последовательности, для которых заданное предикат истинно. Результат filter будет таким же, как и входные данные (последовательность, поток или массив). Документы могут быть отфильтрованы различными способами — диапазоны, вложенные значения, булевы условия и результаты анонимных функций.

Пример: Получить всех пользователей, которым 30 лет.

r.table('users').filter({'age': 30}).run(conn)

Предикат {'age': 30} выбирает документы в таблице users с полем age, значение которого 30. Документы с полем age с любым другим значением или без поля age пропускаются.

Подробнее об этой команде →

Объединения

inner_join

sequence.inner_join(other_sequence, predicate_function) → stream
array.inner_join(other_sequence, predicate_function) → array

Возвращает внутреннее объединение двух последовательностей.

Пример: Возвращает список всех противостояний между героями Marvel и DC, в которых герой DC мог бы победить героя Marvel в бою.

r.table('marvel').inner_join(r.table('dc'),
    lambda marvel_row, dc_row: marvel_row['strength'] < dc_row['strength']
).zip().run(conn)

Подробнее об этой команде →

outer_join

sequence.outer_join(other_sequence, predicate_function) → stream
array.outer_join(other_sequence, predicate_function) → array

Возвращает левое внешнее объединение двух последовательностей. Полученная последовательность представляет собой объединение левой и правой последовательностей: все документы из левой последовательности будут возвращены, каждый сопоставлен с документом в правой последовательности, если он удовлетворяет условиям предиката. В большинстве случаев вам потребуется после объединения использовать zip для объединения левых и правых результатов.

Пример: Возвращает список всех героев Marvel, сопоставленных с любыми героями DC, которые могли бы их победить в бою.

r.table('marvel').outer_join(r.table('dc'),
  lambda marvel_row, dc_row: marvel_row['strength'] < dc_row['strength']
).zip().run(conn)

(Сравните это с inner_join с теми же входными данными и предикатом, который вернет список только тех противостояний, в которых у героя DC выше сила.)

Подробнее об этой команде →

eq_join

sequence.eq_join(left_field, right_table[, index='id', ordered=False]) → sequence
sequence.eq_join(function, right_table[, index='id', ordered=False]) → sequence

Объединение таблиц с использованием поля или функции в левой последовательности, сопоставляющей первичные ключи или вторичные индексы в правой таблице. eq_join более эффективен, чем другие типы объединений ReQL, и работает намного быстрее. Документы в наборе результатов представляют собой пары документов из левой и правой таблиц, сопоставленные, когда поле в левой стороне существует и не является пустым, и существует запись со значением этого поля в указанном индексе в правой стороне.

Пример: Сопоставление игроков с играми, в которых они играли друг против друга.

Объедините эти таблицы с использованием game_id в таблице игроков и id в таблице игр:

r.table('players').eq_join('game_id', r.table('games')).run(conn)

Это вернёт набор результатов, например, следующий:

[
    {
        "left" : { "game_id" : 3, "id" : 2, "player" : "Agatha" },
        "right" : { "id" : 3, "field" : "Bucklebury" }
    },
    {
        "left" : { "game_id" : 2, "id" : 3, "player" : "Fred" },
        "right" : { "id" : 2, "field" : "Rushock Bog" }
    },
    ...
]

Подробнее об этой команде →

zip

stream.zip() → stream
array.zip() → array

Используется для «сжатия» результата объединения путем объединения полей «правый» в поля «левый» каждого члена последовательности.

Пример: «Сжимает» последовательность, объединяя левые и правые поля, полученные в результате объединения.

r.table('marvel').eq_join('main_dc_collaborator', r.table('dc')).zip().run(conn)

Подробнее об этой команде →

Преобразования

map

sequence1.map([sequence2, ...], function) → stream
array1.map([array2, ...], function) → array
r.map(sequence1[, sequence2, ...], function) → stream
r.map(array1[, array2, ...], function) → array

Преобразует каждый элемент одного или нескольких последовательностей, применяя к ним функцию отображения. Если map выполняется с двумя или более последовательностями, она будет итерироваться по столько элементов, сколько их в самой короткой последовательности.

Пример: Возвращает первые пять квадратов.

> r.expr([1, 2, 3, 4, 5]).map(lambda val: (val * val)).run(conn)

[1, 4, 9, 16, 25]

Подробнее об этой команде →

with_fields

sequence.with_fields([selector1, selector2...]) → stream
array.with_fields([selector1, selector2...]) → array

Извлекает один или несколько атрибутов из последовательности объектов, отфильтровывая любые объекты в последовательности, у которых отсутствуют указанные поля. Функционально это идентично has_fields, за которым следует pluck над последовательностью.

Пример: Получить список пользователей и их постов, исключая пользователей, которые не сделали ни одного поста.

Структура существующей таблицы:

[
    { 'id': 1, 'user': 'bob', 'email': 'bob@foo.com', 'posts': [ 1, 4, 5 ] },
    { 'id': 2, 'user': 'george', 'email': 'george@foo.com' },
    { 'id': 3, 'user': 'jane', 'email': 'jane@foo.com', 'posts': [ 2, 3, 6 ] }
]

Команда и вывод:

r.table('users').with_fields('id', 'user', 'posts').run(conn)

[
    { 'id': 1, 'user': 'bob', 'posts': [ 1, 4, 5 ] },
    { 'id': 3, 'user': 'jane', 'posts': [ 2, 3, 6 ] }
]

Подробнее об этой команде →

concat_map

stream.concat_map(function) → stream
array.concat_map(function) → array

Объединяет один или несколько элементов в одну последовательность, используя функцию отображения.

Пример: Создать последовательность всех монстров, побеждённых героями Marvel. Поле “defeatedMonsters” представляет собой массив из одного или нескольких имён монстров.

r.table('marvel').concat_map(lambda hero: hero['defeatedMonsters']).run(conn)

Подробнее об этой команде →

order_by

table.order_by([key | function], index=index_name) → table_slice
selection.order_by(key | function[, ...]) → selection<array>
sequence.order_by(key | function[, ...]) → array

Сортирует последовательность по значениям документов заданного ключа(ей). Для указания порядка оберните атрибут либо r.asc , либо r.desc (по умолчанию возрастание).

Пример: Отсортировать все посты по индексу date.

r.table('posts').order_by(index='date').run(conn)

Подробнее об этой команде →

skip

sequence.skip(n) → stream
array.skip(n) → array

Пропускает заданное количество элементов с начала последовательности.

Пример: Здесь, в сочетании с order_by, мы выбираем проигнорировать самых успешных героев.

r.table('marvel').order_by('successMetric').skip(10).run(conn)

Подробнее об этой команде →

limit

sequence.limit(n) → stream
array.limit(n) → array

Останавливает последовательность после заданного количества элементов.

Пример: В наш Пантеон героев поместятся только определённое количество.

r.table('marvel').order_by('belovedness').limit(10).run(conn)

Подробнее об этой команде →

slice, []

selection.slice(start_offset[, end_offset, left_bound='closed', right_bound='open']) → selection
stream.slice(start_offset[, end_offset, left_bound='closed', right_bound='open']) → stream
array.slice(start_offset[, end_offset, left_bound='closed', right_bound='open']) → array
binary.slice(start_offset[, end_offset, left_bound='closed', right_bound='open']) → binary
string.slice(start_offset[, end_offset, left_bound='closed', right_bound='open']) → string

Возвращает элементы последовательности в заданном диапазоне.

Пример: Возвратить четвёртого, пятого и шестого самых молодых игроков. (Самый молодой игрок имеет индекс 0, поэтому это элементы 3–5.)

r.table('players').order_by(index='age').slice(3,6).run(conn)

Или, используя оператор среза Python:

r.table('players').filter({'class': 'amateur'})[10:20].run(conn)

Подробнее об этой команде →

nth

sequence.nth(index) → object
selection.nth(index) → selection<object>

Получает n-ый элемент последовательности, считая с нуля. Если аргумент отрицательный, считает с последнего элемента.

Пример: Выберите второй элемент в массиве.

r.expr([1,2,3]).nth(1).run(conn)
r.expr([1,2,3])[1].run(conn)

Подробнее об этой команде →

offsets_of

sequence.offsets_of(datum | predicate_function) → array

Получает индексы элемента в последовательности. Если аргумент является предикатом, получает индексы всех элементов, соответствующих ему.

Пример: Найдите позицию буквы ‘c’.

r.expr(['a','b','c']).offsets_of('c').run(conn)

Подробнее об этой команде →

is_empty

sequence.is_empty() → bool

Проверяет, пуста ли последовательность.

Пример: Есть ли какие-либо документы в таблице marvel?

r.table('marvel').is_empty().run(conn)

Подробнее об этой команде →

union

stream.union(sequence[, sequence, ...][, interleave=True]) → stream
array.union(sequence[, sequence, ...][, interleave=True]) → array
r.union(stream, sequence[, sequence, ...][, interleave=True]) → stream
r.union(array, sequence[, sequence, ...][, interleave=True]) → array

Объединяет две или более последовательности.

Пример: Создать поток всех героев.

r.table('marvel').union(r.table('dc')).run(conn)

Подробнее об этой команде →

sample

sequence.sample(number) → selection
stream.sample(number) → array
array.sample(number) → array

Выбирает заданное количество элементов из последовательности с равномерным случайным распределением. Выбор осуществляется без возвращения.

Пример: Выберите 3 случайных героя.

r.table('marvel').sample(3).run(conn)

Подробнее об этой команде →

Агрегирование

group

sequence.group(field | function..., [index=<indexname>, multi=False]) → grouped_stream
r.group(sequence, field | function..., [index=<indexname>, multi=False]) → grouped_stream

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

Пример: Группировка игр по игрокам.

> r.table('games').group('player').run(conn)

{
    "Alice": [
        {"id": 5, "player": "Alice", "points": 7, "type": "free"},
        {"id": 12, "player": "Alice", "points": 2, "type": "free"}
    ],
    "Bob": [
        {"id": 2, "player": "Bob", "points": 15, "type": "ranked"},
        {"id": 11, "player": "Bob", "points": 10, "type": "free"}
    ]
}

Подробнее об этой команде →

ungroup

grouped_stream.ungroup() → array
grouped_data.ungroup() → array

Принимает сгруппированный поток или данные и преобразует их в массив объектов, представляющих группы. Любые команды, присоединенные после ungroup , будут работать с этим массивом, а не с каждой группой индивидуально. Это полезно, если вы хотите, например, отсортировать группы по значению их сворачивания.

Пример: Каково максимальное количество очков, набранных каждым игроком, с лучшими результатами вначале?

r.table('games')
   .group('player').max('points')['points']
   .ungroup().order_by(r.desc('reduction')).run(conn)

Подробнее об этой команде →

reduce

sequence.reduce(function) → value
r.reduce(sequence, function) → value

Производит одно значение из последовательности путем многократного применения функции сокращения.

Пример: Возвращает количество документов в таблице posts.

r.table("posts").map(lambda doc: 1)
    .reduce(lambda left, right: left+right)
    .default(0).run(conn)

Более короткий способ выполнения этого запроса — использование count.

Подробнее об этой команде →

fold

sequence.fold(base, function) → value
sequence.fold(base, function, emit=function[, final_emit=function]) → sequence

Применяет функцию к последовательности по порядку, сохраняя состояние через аккумулятор. Команда fold возвращает либо одно значение, либо новую последовательность.

Пример: Объединение слов из списка.

r.table('words').order_by('id').fold('',
    lambda acc, word: acc + r.branch(acc == '', '', ', ') + word
).run(conn)

(Этот пример можно реализовать с помощью reduce, но fold сохранит порядок, когда words является таблицей RethinkDB или другим потоком, что не гарантируется с reduce.)

Подробнее об этой команде →

count

sequence.count([value | predicate_function]) → number
binary.count() → number
string.count() → number
object.count() → number
r.count(sequence | binary | string | object[, predicate_function]) → number

Подсчитывает количество элементов в последовательности или пар ключ/значение в объекте, или возвращает размер строки или двоичного объекта.

Пример: Подсчет количества пользователей.

r.table('users').count().run(conn)

Подробнее об этой команде →

sum

sequence.sum([field | function]) → number
r.sum(sequence, [field | function]) → number

Суммирует все элементы последовательности. Если вызывается с именем поля, суммирует все значения этого поля в последовательности, пропуская элементы последовательности, которым не хватает этого поля. Если вызывается с функцией, вызывает эту функцию для каждого элемента последовательности и суммирует результаты, пропуская элементы последовательности, где эта функция возвращает None или ошибку отсутствия.

Пример: Что такое 3 + 5 + 7?

r.expr([3, 5, 7]).sum().run(conn)

Подробнее об этой команде →

avg

sequence.avg([field | function]) → number
r.avg(sequence, [field | function]) → number

Вычисляет среднее значение всех элементов последовательности. Если вызывается с именем поля, вычисляет среднее значение всех значений этого поля в последовательности, пропуская элементы последовательности, которым не хватает этого поля. Если вызывается с функцией, вызывает эту функцию для каждого элемента последовательности и вычисляет среднее значение результатов, пропуская элементы последовательности, где эта функция возвращает None или ошибку отсутствия.

Пример: Каково среднее значение 3, 5 и 7?

r.expr([3, 5, 7]).avg().run(conn)

Подробнее об этой команде →

min

sequence.min(field | function) → element
sequence.min(index=<indexname>) → element
r.min(sequence, field | function) → element
r.min(sequence, index=<indexname>) → element

Находит минимальный элемент последовательности.

Пример: Вернуть минимальное значение в списке [3, 5, 7].

r.expr([3, 5, 7]).min().run(conn)

Подробнее об этой команде →

max

sequence.max(field | function) → element
sequence.max(index=<indexname>) → element
r.max(sequence, field | function) → element
r.max(sequence, index=<indexname>) → element

Находит максимальный элемент последовательности.

Пример: Вернуть максимальное значение в списке [3, 5, 7].

r.expr([3, 5, 7]).max().run(conn)

Подробнее об этой команде →

distinct

sequence.distinct() → array
table.distinct([index=<indexname>]) → stream
r.distinct(sequence) → array
r.distinct(table, [index=<indexname>]) → stream

Удаляет дубликаты элементов из последовательности.

Пример: Какие уникальные злодеи были побеждены героями Marvel?

r.table('marvel').concat_map(
    lambda hero: hero['villain_list']).distinct().run(conn)

Подробнее об этой команде →

contains

sequence.contains([value | predicate_function, ...]) → bool
r.contains(sequence, [value | predicate_function, ...]) → bool

При вызове со значениями, возвращает True если последовательность содержит все указанные значения. При вызове с предикатными функциями, возвращает True если для каждого предиката существует по крайней мере один элемент потока, где этот предикат возвращает True.

Пример: Иронмен когда-либо сражался с Суперменом?

r.table('marvel').get('ironman')['opponents'].contains('superman').run(conn)

Подробнее об этой команде →

Обработка документов

row

r.row → value

Возвращает текущий посещаемый документ.

Пример: Получить всех пользователей, чей возраст больше 5.

r.table('users').filter(r.row['age'] > 5).run(conn)

Подробнее об этой команде →

pluck

sequence.pluck([selector1, selector2...]) → stream
array.pluck([selector1, selector2...]) → array
object.pluck([selector1, selector2...]) → object
singleSelection.pluck([selector1, selector2...]) → object

Извлекает одно или несколько атрибутов из объекта или последовательности объектов (проекция).

Пример: Нам нужна только информация о реакторе Железного человека, а не весь остальной документ.

r.table('marvel').get('IronMan').pluck('reactorState', 'reactorPower').run(conn)

Подробнее об этой команде →

without

sequence.without([selector1, selector2...]) → stream
array.without([selector1, selector2...]) → array
singleSelection.without([selector1, selector2...]) → object
object.without([selector1, selector2...]) → object

Обратное pluck; принимает объект или последовательность объектов и возвращает их с удаленными указанными путями.

Пример: Поскольку нам это не нужно для этого вычисления, мы сэкономим пропускную способность и оставим список любовных увлечений Железного человека.

r.table('marvel').get('IronMan').without('personalVictoriesList').run(conn)

Подробнее об этой команде →

merge

singleSelection.merge([object | function, object | function, ...]) → object
object.merge([object | function, object | function, ...]) → object
sequence.merge([object | function, object | function, ...]) → stream
array.merge([object | function, object | function, ...]) → array

Объединяет два или более объекта для создания нового объекта со свойствами всех объектов. При конфликте имён полей предпочтение отдаётся полям в правом объекте в списке аргументов merge также принимает функцию подзапроса, возвращающую объект, которая будет использоваться аналогично функции map.

Пример: Подготовить Тора к битве.

r.table('marvel').get('thor').merge(
    r.table('equipment').get('hammer'),
    r.table('equipment').get('pimento_sandwich')
).run(conn)

Подробнее об этой команде →

append

array.append(value) → array

Добавляет значение в массив.

Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.

r.table('marvel').get('IronMan')['equipment'].append('newBoots').run(conn)

Подробнее об этой команде →

prepend

array.prepend(value) → array

Добавляет значение в начало массива.

Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.

r.table('marvel').get('IronMan')['equipment'].prepend('newBoots').run(conn)

Подробнее об этой команде →

difference

array.difference(array) → array

Удаляет элементы одного массива из другого массива.

Пример: Получить список снаряжения Железного человека без ботинок.

r.table('marvel').get('IronMan')['equipment'].difference(['Boots']).run(conn)

Подробнее об этой команде →

set_insert

array.set_insert(value) → array

Добавляет значение в массив и возвращает его как множество (массив с уникальными значениями).

Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.

r.table('marvel').get('IronMan')['equipment'].set_insert('newBoots').run(conn)

Подробнее об этой команде →

set_union

array.set_union(array) → array

Добавляет несколько значений в массив и возвращает его как множество (массив с уникальными значениями).

Пример: Получить список снаряжения Железного человека с добавлением новых ботинок и реактора.

r.table('marvel').get('IronMan')['equipment'].set_union(['newBoots', 'arc_reactor']).run(conn)

Подробнее об этой команде →

set_intersection

array.set_intersection(array) → array

Пересекает два массива, возвращая значения, присутствующие в обоих, как множество (массив с уникальными значениями).

Пример: Проверить, какое снаряжение Железный человек имеет из фиксированного списка.

r.table('marvel').get('IronMan')['equipment'].set_intersection(['newBoots', 'arc_reactor']).run(conn)

Подробнее об этой команде →

set_difference

array.set_difference(array) → array

Удаляет элементы одного массива из другого и возвращает их как множество (массив с уникальными значениями).

Пример: Проверить, какое снаряжение Железный человек имеет, исключая фиксированный список.

r.table('marvel').get('IronMan')['equipment'].set_difference(['newBoots', 'arc_reactor']).run(conn)

Подробнее об этой команде →

[] (bracket)

sequence[attr] → sequence
singleSelection[attr] → value
object[attr] → value
array[index] → value

Получает одно поле из объекта. Если вызвана для последовательности, получает это поле из каждого объекта в последовательности, пропускает объекты, у которых этого поля нет.

Пример: Какое было первое появление Железного человека в комиксе?

r.table('marvel').get('IronMan')['firstAppearance'].run(conn)

Подробнее об этой команде →

get_field

sequence.get_field(attr) → sequence
singleSelection.get_field(attr) → value
object.get_field(attr) → value

Получает одно поле из объекта. Если вызвана для последовательности, получает это поле из каждого объекта в последовательности, пропускает объекты, у которых этого поля нет.

Пример: Какое было первое появление Железного человека в комиксе?

r.table('marvel').get('IronMan').get_field('firstAppearance').run(conn)

Подробнее об этой команде →

has_fields

sequence.has_fields([selector1, selector2...]) → stream
array.has_fields([selector1, selector2...]) → array
object.has_fields([selector1, selector2...]) → boolean

Проверяет, есть ли у объекта одно или несколько полей. Объект имеет поле, если у него есть этот ключ и ключ имеет ненулевое значение. Например, у объекта {'a': 1,'b': 2,'c': null} есть поля a и b.

Пример: Возвратить игроков, выигравших игры.

r.table('players').has_fields('games_won').run(conn)

Подробнее об этой команде →

insert_at

array.insert_at(offset, value) → array

Вставляет значение в массив по указанному индексу. Возвращает изменённый массив.

Пример: Халк решает присоединиться к Мстителям.

r.expr(["Iron Man", "Spider-Man"]).insert_at(1, "Hulk").run(conn)

Подробнее об этой команде →

splice_at

array.splice_at(offset, array) → array

Вставляет несколько значений в массив по указанному индексу. Возвращает изменённый массив.

Пример: Халк и Тор решают присоединиться к Мстителям.

r.expr(["Iron Man", "Spider-Man"]).splice_at(1, ["Hulk", "Thor"]).run(conn)

Подробнее об этой команде →

delete_at

array.delete_at(offset [,end_offset]) → array

Удаляет один или несколько элементов из массива по указанному индексу. Возвращает изменённый массив. (Примечание: delete_at работает с массивами, а не документами; для удаления документов см. команду delete.)

Пример: Удалить второй элемент массива.

> r.expr(['a','b','c','d','e','f']).delete_at(1).run(conn)

['a', 'c', 'd', 'e', 'f']

Подробнее об этой команде →

change_at

array.change_at(offset, value) → array

Изменяет значение в массиве по указанному индексу. Возвращает изменённый массив.

Пример: Брюс Баннер превращается в Халка.

r.expr(["Iron Man", "Bruce", "Spider-Man"]).change_at(1, "Hulk").run(conn)

Подробнее об этой команде →

keys

singleSelection.keys() → array
object.keys() → array

Возвращает массив, содержащий все ключи объекта. Обратите внимание, что ключи будут отсортированы так, как описано в типах данных ReQL (для строк — лексикографически).

Пример: Получить все ключи из строки таблицы.

# row: { "id": 1, "mail": "fred@example.com", "name": "fred"  }

r.table('users').get(1).keys().run(conn)

> [ "id", "mail", "name" ]

Подробнее об этой команде →

values

singleSelection.values() → array
object.values() → array

Возвращает массив, содержащий все значения объекта. values() гарантирует, что значения будут возвращены в том же порядке, что и у keys.

Пример: Получить все значения из строки таблицы.

# row: { "id": 1, "mail": "fred@example.com", "name": "fred"  }

r.table('users').get(1).values().run(conn)

> [ 1, "fred@example.com", "fred" ]

Подробнее об этой команде →

literal

r.literal(object) → special

Заменяет объект в поле вместо слияния его с существующим объектом в операции merge или update. = Использование literal без аргументов в операциях merge или update удалит соответствующее поле.

Пример: Заменить один вложенный документ другим, а не объединять поля.

r.table('users').get(1).update({ 'data': r.literal({ 'age': 19, 'job': 'Engineer' }) }).run(conn)

{
    "id": 1,
    "name": "Alice",
    "data": {
        "age": 19,
        "job": "Engineer"
    }
}

Подробнее об этой команде →

object

r.object([key, value,]...) → object

Создаёт объект из списка пар ключ-значение, где ключи должны быть строками. r.object(A, B, C, D) эквивалентно r.expr([[A, B], [C, D]]).coerce_to('OBJECT').

Пример: Создать простой объект.

> r.object('id', 5, 'data', ['foo', 'bar']).run(conn)
{'data': ["foo", "bar"], 'id': 5}

Подробнее об этой команде →

Обработка строк

match

string.match(regexp) → None/object

Сопоставляет строку с регулярным выражением. Если совпадение найдено, возвращает объект с полями:

  • str: Совпавшая строка
  • start: Начало совпавшей строки
  • end: Конец совпавшей строки
  • groups: Группы захвата, определённые в скобках

Если совпадение не найдено, возвращает None.

Пример: Получить всех пользователей, чьи имена начинаются с «А». Так как None вычисляется в false в filter, можно просто использовать результат match в качестве предиката.

r.table('users').filter(lambda doc:
    doc['name'].match("^A")
).run(conn)

Подробнее об этой команде →

split

string.split([separator, [max_splits]]) → array

Разбивает строку на подстроки. Разбивает по пробелам, если вызов не содержит аргументов. Если указан разделитель, разбивает по этому разделителю. Если указан разделитель и максимальное количество разбиений, разбивает по этому разделителю не более max_splits раз. (Можно использовать None в качестве разделителя, чтобы разбивать по пробелам, при этом всё ещё задавая max_splits.)

Пример: Разбить по пробелам.

> r.expr("foo  bar bax").split().run(conn)
["foo", "bar", "bax"]

Подробнее об этой команде →

upcase

string.upcase() → string

Преобразует строку в верхний регистр.

Пример:

> r.expr("Sentence about LaTeX.").upcase().run(conn)
"SENTENCE ABOUT LATEX."

Примечание: upcase и downcase влияют только на символы ASCII.

Подробнее об этой команде →

downcase

string.downcase() → string

Преобразует строку в нижний регистр.

Пример:

> r.expr("Sentence about LaTeX.").downcase().run(conn)
"sentence about latex."

Примечание: upcase и downcase влияют только на символы ASCII.

Подробнее об этой команде →

Математика и логика

+

value + value → value
time + number → time
value.add(value[, value, ...]) → value
time.add(number[, number, ...]) → time

Сложить два или более чисел или конкатенировать две или более строки или массивы.

Пример: Это так же просто, как 2 + 2 = 4.

> (r.expr(2) + 2).run(conn)

4

Подробнее об этой команде →

-

number - number → number
time - number → time
time - time → number
number.sub(number[, number, ...]) → number
time.sub(number[, number, ...]) → time
time.sub(time) → number

Вычесть два числа.

Пример: Это так же просто, как 2 - 2 = 0.

(r.expr(2) - 2).run(conn)

Подробнее об этой команде →

*

number * number → number
array * number → array
number.mul(number[, number, ...]) → number
array.mul(number[, number, ...]) → array

Перемножить два числа или создать периодический массив.

Пример: Это так же просто, как 2 * 2 = 4.

(r.expr(2) * 2).run(conn)

Подробнее об этой команде →

/

number / number → number
number.div(number[, number ...]) → number

Разделить два числа.

Пример: Это так же просто, как 2 / 2 = 1.

(r.expr(2) / 2).run(conn)

Подробнее об этой команде →

%

number % number → number

Найти остаток от деления двух чисел.

Пример: Это так же просто, как 2 % 2 = 0.

(r.expr(2) % 2).run(conn)

Подробнее об этой команде →

&, and_

bool & bool → bool
bool.and_([bool, bool, ...]) → bool
r.and_([bool, bool, ...]) → bool

Вычислить логическое «и» одного или нескольких значений.

Пример: Вернуть, истинно ли a и b.

> a = True
> b = False
> (r.expr(a) & b).run(conn)

False

Подробнее об этой команде →

|, or_

bool | bool → bool
bool.or_([bool, bool, ...]) → bool
r.or_([bool, bool, ...]) → bool

Вычислить логическое «или» одного или нескольких значений.

Пример: Вернуть, истинно ли либо a , либо b.

> a = True
> b = False
> (r.expr(a) | b).run(conn)

True

Подробнее об этой команде →

==, eq

value.eq(value[, value, ...]) → bool
value == value → bool

Проверить, равны ли два или более значения.

Пример: Проверить, установлено ли поле role пользователя на значение administrator.

r.table('users').get(1)['role'].eq('administrator').run(conn)
# alternative syntax
(r.table('users').get(1)['role'] == 'administrator').run(conn)

Подробнее об этой команде →

!=, ne

value.ne(value[, value, ...]) → bool
value != value → bool

Проверить, не равны ли два или более значения.

Пример: Проверить, не установлено ли поле role пользователя на значение administrator.

r.table('users').get(1)['role'].ne('administrator').run(conn)
# alternative syntax
(r.table('users').get(1)['role'] != 'administrator').run(conn)

Подробнее об этой команде →

>, gt

value.gt(value[, value, ...]) → bool
value > value → bool

Сравнить значения, проверяя, больше ли левое значение правого.

Пример: Проверить, набрал ли игрок больше 10 очков.

r.table('players').get(1)['score'].gt(10).run(conn)
# alternative syntax
(r.table('players').get(1)['score'] > 10).run(conn)

Подробнее об этой команде →

>=, ge

value.ge(value[, value, ...]) → bool
value >= value → bool

Сравнить значения, проверяя, больше или равно ли левое значение правому.

Пример: Проверить, набрал ли игрок 10 или более очков.

r.table('players').get(1)['score'].ge(10).run(conn)
# alternative syntax
(r.table('players').get(1)['score'] >= 10).run(conn)

Подробнее об этой команде →

<, lt

value.lt(value[, value, ...]) → bool
value < value → bool

Сравнить значения, проверяя, меньше ли левое значение правого.

Пример: Проверить, набрал ли игрок меньше 10 очков.

r.table('players').get(1)['score'].lt(10).run(conn)
# alternative syntax
(r.table('players').get(1)['score'] < 10).run(conn)

Подробнее об этой команде →

<=, le

value.le(value[, value, ...]) → bool
value <= value → bool

Сравнить значения, проверяя, меньше или равно ли левое значение правому.

Пример: Проверить, набрал ли игрок 10 или меньше очков.

r.table('players').get(1)['score'].le(10).run(conn)
# alternative syntax
(r.table('players').get(1)['score'] <= 10).run(conn)

Подробнее об этой команде →

~, not_

bool.not_() → bool
not_(bool) → bool
(~bool) → bool

Вычислить логическое отрицание (не) выражения.

Пример: Не истинно — ложно.

r.not_(True).run(conn)
r.expr(True).not_().run(conn)
(~r.expr(True)).run(conn)

Эти значения равны false.

Обратите внимание, что при использовании ~ выражение заключено в скобки. Без этого Python вычислит r.expr(True) сначала, а не используя оператор ReQL, и вернёт неправильное значение. (~True вычисляется как -2 в Python.)

Подробнее об этой команде →

bit_and

r.bit_and(number) → number
r.bit_and(number[, number, ...]) → number

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

Пример: Вычислить арифметическое «и» 6 и 4.

r.expr(6).bit_and(4).run(conn)

Подробнее об этой команде →

bit_or

r.bit_or(number) → number
r.bit_or(number[, number, ...]) → number

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

Пример: Вычислить арифметическое «или» 6 и 4.

r.expr(6).bit_or(4).run(conn)

Подробнее об этой команде →

bit_xor

r.bit_xor(number) → number
r.bit_xor(number[, number, ...]) → number

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

Пример: Вычислить арифметическое «исключающее или» 6 и 4.

r.expr(6).bit_xor(4).run(conn)

Подробнее об этой команде →

bit_not

r.bit_not() → number

Вычислить арифметическое отрицание (не) выражения. bit_not не принимает аргументов.

Пример: Отрицание арифметического выражения

r.expr(15).bit_not().run(conn)

Подробнее об этой команде →

bit_sal

r.bit_sal(number) → number
r.bit_sal(number[, number, ...]) → number

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

Пример: Вычислить арифметический сдвиг влево 5 и 4.

r.expr(5).bit_sal(4).run(conn)

Подробнее об этой команде →

bit_sar

r.bit_sar(number) → number
r.bit_sar(number[, number, ...]) → number

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

Пример: Вычислить арифметический сдвиг вправо 32 и 3.

r.expr(32).bit_sar(3).run(conn)

Подробнее об этой команде →

random

r.random() → number
r.random(number[, number], float=True) → number
r.random(integer[, integer]) → integer

Сгенерировать случайное число в заданных (или подразумеваемых) границах. random принимает ноль, одно или два аргумента.

Пример: Сгенерировать случайное число в диапазоне [0,1).

r.random().run(conn)

Подробнее об этой команде →

round

r.round(number) → number
number.round() → number

Округляет данное значение до ближайшего целого числа.

Пример: Округлить 12.345 до ближайшего целого.

> r.round(12.345).run(conn)

12.0

Команда round также может быть использована после выражения.

Подробнее об этой команде →

ceil

r.ceil(number) → number
number.ceil() → number

Округляет значение вверх, возвращая наименьшее целое значение, большее или равное заданному значению (верхняя граница значения).

Пример: Вернуть верхнюю границу 12.345.

> r.ceil(12.345).run(conn)

13.0

Команда ceil также может быть использована после выражения.

Подробнее об этой команде →

floor

r.floor(number) → number
number.floor() → number

Округляет значение вниз, возвращая наибольшее целое значение, меньшее или равное заданному значению (нижняя граница значения).

Пример: Вернуть нижнюю границу 12.345.

> r.floor(12.345).run(conn)

12.0

Команда floor также может быть использована после выражения.

Подробнее об этой команде →

Даты и время

now

r.now() → time

Возвращает объект времени, представляющий текущее время в UTC. Команда now() вычисляется один раз при получении запроса сервером, поэтому несколько экземпляров r.now() всегда будут возвращать одно и то же время внутри запроса.

Пример: Добавить нового пользователя со временем его подписки.

r.table("users").insert({
    "name": "John",
    "subscription_date": r.now()
}).run(conn)

Подробнее об этой команде →

time

r.time(year, month, day[, hour, minute, second], timezone) → time

Создаёт объект времени для определённого момента времени.

Пример: Обновить дату рождения пользователя «Иоанн» на 3 ноября 1986 года по UTC.

r.table("user").get("John").update({"birthdate": r.time(1986, 11, 3, 'Z')}).run(conn)

Подробнее об этой команде →

epoch_time

r.epoch_time(number) → time

Создаёт объект времени, основанный на секундах с начала эпохи. Первый аргумент — число с плавающей точкой, которое будет округлено до трёх десятичных знаков (точность до миллисекунды).

Пример: Обновить дату рождения пользователя «Иоанн» на 3 ноября 1986 года.

r.table("user").get("John").update({"birthdate": r.epoch_time(531360000)}).run(conn)

Подробнее об этой команде →

iso8601

r.iso8601(string[, default_timezone='']) → time

Создаёт объект времени на основе строки даты и времени ISO 8601 (например, ‘2013-01-01T01:01:01+00:00’). RethinkDB поддерживает все допустимые форматы ISO 8601, кроме форматов дат недели. Подробнее о формате ISO 8601 можно узнать на Wikipedia.

Пример: Обновить время рождения Иоанна.

r.table("user").get("John").update({"birth": r.iso8601('1986-11-03T08:30:00-07:00')}).run(conn)

Подробнее об этой команде →

in_timezone

time.in_timezone(timezone) → time

Возвращает новый объект времени с другим часовым поясом. Время остаётся неизменным, но результаты, возвращаемые методами, такими как hours(), изменятся, так как они учитывают часовой пояс. Аргумент часового пояса должен быть в формате ISO 8601.

Пример: Час дня в Сан-Франциско (UTC/GMT -8, без учета летнего времени).

r.now().in_timezone('-08:00').hours().run(conn)

Подробнее об этой команде →

timezone

time.timezone() → string

Возвращает часовой пояс объекта времени.

Пример: Возвратить всех пользователей в часовом поясе «-07:00».

r.table("users").filter(lambda user:
    user["subscriptionDate"].timezone() == "-07:00"
)

Подробнее об этой команде →

during

time.during(start_time, end_time[, left_bound="closed", right_bound="open"]) → bool

Возвращает, находится ли время между двумя другими временами.

Пример: Получить все сообщения, опубликованные между 1 декабря 2013 года (включительно) и 10 декабря 2013 года (исключительно).

r.table("posts").filter(
    r.row['date'].during(r.time(2013, 12, 1, "Z"), r.time(2013, 12, 10, "Z"))
).run(conn)

Подробнее об этой команде →

date

time.date() → time

Возвращает новый объект времени, основанный только на дне, месяце и году (то есть, то же самое время в 00:00).

Пример: Получить всех пользователей, чей день рождения сегодня.

r.table("users").filter(lambda user:
    user["birthdate"].date() == r.now().date()
).run(conn)

Подробнее об этой команде →

time_of_day

time.time_of_day() → number

Возвращает количество секунд, прошедших с начала дня, хранящегося в объекте времени.

Пример: Получить сообщения, отправленные до полудня.

r.table("posts").filter(
    r.row["date"].time_of_day() <= 12*60*60
).run(conn)

Подробнее об этой команде →

year

time.year() → number

Возвращает год объекта времени.

Пример: Получить всех пользователей, родившихся в 1986 году.

r.table("users").filter(lambda user:
    user["birthdate"].year() == 1986
).run(conn)

Подробнее об этой команде →

month

time.month() → number

Возвращает месяц объекта времени как число от 1 до 12. Для удобства определены термины r.january, r.february и т.д., которые сопоставляются с соответствующими целыми числами.

Пример: Получить всех пользователей, родившихся в ноябре.

r.table("users").filter(
    r.row["birthdate"].month() == 11
)

Подробнее об этой команде →

day

time.day() → number

Возвращает день объекта времени как число от 1 до 31.

Пример: Возвратить пользователей, родившихся 24 числа любого месяца.

r.table("users").filter(
    r.row["birthdate"].day() == 24
)

Подробнее об этой команде →

day_of_week

time.day_of_week() → number

Возвращает день недели объекта времени как число от 1 до 7 (в соответствии со стандартом ISO 8601). Для удобства определены термины r.monday, r.tuesday и т.д., которые сопоставляются с соответствующими целыми числами.

Пример: Возвратить день недели сегодня.

r.now().day_of_week().run(conn)

Подробнее об этой команде →

day_of_year

time.day_of_year() → number

Возвращает день года объекта времени как число от 1 до 366 (в соответствии со стандартом ISO 8601).

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

r.table("users").filter(
    r.row["birthdate"].day_of_year() == 1
).run(conn)

Подробнее об этой команде →

hours

time.hours() → number

Возвращает час в объекте времени как число от 0 до 23.

Пример: Возвратить все сообщения, отправленные после полуночи и до 4 утра.

r.table("posts").filter(lambda post:
    post["date"].hours() < 4
).run(conn)

Подробнее об этой команде →

minutes

time.minutes() → number

Возвращает минуту в объекте времени как число от 0 до 59.

Пример: Возвратить все сообщения, отправленные в первые 10 минут каждого часа.

r.table("posts").filter(lambda post:
    post["date"].minutes() < 10
).run(conn)

Подробнее об этой команде →

seconds

time.seconds() → number

Возвращает секунды в объекте времени как число от 0 до 59.999 (двойная точность).

Пример: Возвратить сообщения, отправленные в первые 30 секунд каждой минуты.

r.table("posts").filter(lambda post:
    post["date"].seconds() < 30
).run(conn)

Подробнее об этой команде →

to_iso8601

time.to_iso8601() → string

Преобразует объект времени в строку в формате ISO 8601.

Пример: Возвратить текущее время в формате ISO 8601.

> r.now().to_iso8601().run(conn)

"2015-04-20T18:37:52.690+00:00"

Подробнее об этой команде →

to_epoch_time

time.to_epoch_time() → number

Преобразует объект времени в его эпохальное время.

Пример: Возвратить текущее время в секундах с начала эпохи Unix с точностью до миллисекунды.

r.now().to_epoch_time()

Подробнее об этой команде →

Структуры управления

args

r.args(array) → special

r.args — это специальный термин, используемый для вставки массива аргументов в другой термин. Это полезно, когда вы хотите вызвать вариативный термин, такой как get_all, с набором аргументов, сгенерированных во время выполнения.

Пример: Получить Алису и Боба из таблицы people.

r.table('people').get_all('Alice', 'Bob').run(conn)
# or
r.table('people').get_all(r.args(['Alice', 'Bob'])).run(conn)

Подробнее об этой команде →

binary

r.binary(data) → binary

Инкапсулировать двоичные данные в запросе.

Пример: Сохранить изображение аватара в существующую запись пользователя.

f = open('./default_avatar.png', 'rb')
avatar_image = f.read()
f.close()
r.table('users').get(100).update({'avatar': r.binary(avatar_image)}).run(conn)

Подробнее об этой команде →

do

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

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

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

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

Подробнее об этой команде →

branch

r.branch(test, true_action[, test2, test2_action, ...], false_action) → any
test.branch(true_action[, test2, test2_action, ...], false_action) → any

Выполнить разветвлённую условную операцию, эквивалентную if-then-else.

Команда branch принимает 2n+1 аргумент: пары условных выражений и команд, которые будут выполнены, если условные выражения вернут любое значение, кроме False или None (т. е. «истинностных» значений), с конечной командой «иначе», которая будет выполнена, если все условные выражения являются False или None.

Пример: Проверить значение x.

x = 10
r.branch((x > 5), 'big', 'small').run(conn)

> "big"

Подробнее об этой команде →

for_each

sequence.for_each(write_function) → object

Перебрать последовательность, оценивая заданный запрос записи для каждого элемента.

Пример: Теперь, когда наши герои победили своих злодеев, мы можем безопасно удалить их из таблицы злодеев.

r.table('marvel').for_each(
    lambda hero: r.table('villains').get(hero['villainDefeated']).delete()
).run(conn)

Подробнее об этой команде →

range

r.range() → stream
r.range([start_value, ]end_value) → stream

Сгенерировать поток последовательных целых чисел в заданном диапазоне.

Пример: Вернуть диапазон из четырёх элементов [0, 1, 2, 3].

> r.range(4).run(conn)

[0, 1, 2, 3]

Подробнее об этой команде →

error

r.error(message) → error

Выбросить ошибку выполнения. Если вызывается без аргументов внутри второго аргумента default, повторно выбросить текущую ошибку.

Пример: Железный Человек не мог проиграть битву:

r.table('marvel').get('IronMan').do(
    lambda ironman: r.branch(ironman['victories'] < ironman['battles'],
                             r.error('impossible code path'),
                             ironman)
).run(conn)

Подробнее об этой команде →

default

value.default(default_value | function) → any
sequence.default(default_value | function) → any

Предоставить значение по умолчанию в случае ошибок несоответствия. Команда default оценивает свой первый аргумент (значение, к которому она привязана). Если этот аргумент возвращает None или при оценке выбрасывается ошибка несоответствия, то default возвращает свой второй аргумент. Второй аргумент обычно является значением по умолчанию, но может быть функцией, возвращающей значение.

Пример: Получить названия и авторов таблицы posts. В случае отсутствия поля «автор» или None, мы хотим получить строку Anonymous.

r.table("posts").map(lambda post:
    {
        "title": post["title"],
        "author": post["author"].default("Anonymous")
    }
).run(conn)

Подробнее об этой команде →

expr

r.expr(value) → value

Создать объект ReQL JSON из объекта нативного языка.

Пример: Объекты, обернутые с помощью expr, могут быть затем обработаны функциями API ReQL.

r.expr({'a':'b'}).merge({'b':[1,2,3]}).run(conn)

Подробнее об этой команде →

js

r.js(js_string[, timeout=<number>]) → value

Создать выражение JavaScript.

Пример: Объединить две строки с использованием JavaScript.

timeout — количество секунд до r.js истекает. Значение по умолчанию — 5 секунд.

Всякий раз, когда это возможно, используйте родные команды ReQL, а не r.js, для лучшей производительности.

r.js("'str1' + 'str2'").run(conn)

Подробнее об этой команде →

coerce_to

sequence.coerce_to('array') → array
value.coerce_to('string') → string
string.coerce_to('number') → number
array.coerce_to('object') → object
sequence.coerce_to('object') → object
object.coerce_to('array') → array
binary.coerce_to('string') → string
string.coerce_to('binary') → binary

Преобразовать значение одного типа в другой.

Пример: Преобразовать поток в массив, чтобы сохранить его вывод в поле. (Поток напрямую не может быть сохранен в поле.)

r.table('posts').map(lambda post: post.merge(
    { 'comments': r.table('comments').get_all(post['id'], index='post_id').coerce_to('array') }
)).run(conn)

Подробнее об этой команде →

type_of

any.type_of() → string

Получает тип возвращаемого значения запроса ReQL.

Пример: Получить тип строки.

> r.expr("foo").type_of().run(conn)
"STRING"

Подробнее об этой команде →

info

any.info() → object
r.info(any) → object

Получить информацию о значении ReQL.

Пример: Получить информацию о таблице, такую как первичный ключ или размер кэша.

r.table('marvel').info().run(conn)

Подробнее об этой команде →

json

r.json(json_string) → value

Разбирает строку JSON на сервере.

Пример: Отправить массив на сервер.

r.json("[1,2,3]").run(conn)

Подробнее об этой команде →

to_json_string, to_json

value.to_json_string() → string
value.to_json() → string

Преобразовать значение или объект ReQL в строку JSON. Вы можете использовать либо to_json_string, либо to_json.

Пример: Получить документ ReQL в виде строки JSON.

> r.table('hero').get(1).to_json()

'{"id": 1, "name": "Batman", "city": "Gotham", "powers": ["martial arts", "cinematic entrances"]}'

Подробнее об этой команде →

http

r.http(url[, options]) → value
r.http(url[, options]) → stream

Получить данные из указанного URL по протоколу HTTP. Тип возвращаемого значения зависит от опции result_format, которая по умолчанию проверяет Content-Type ответа. Убедитесь, что вы никогда не используете эту команду для пользовательских URL.

Пример: Выполнить HTTP GET и сохранить результат в таблице.

r.table('posts').insert(r.http('http://httpbin.org/get')).run(conn)

Подробнее об этой команде →

uuid

r.uuid([string]) → string

Возвращает UUID (универсальный уникальный идентификатор), строку, которая может использоваться в качестве уникального идентификатора. Если строка передаётся в uuid в качестве аргумента, UUID будет детерминированным, полученным из хэша SHA-1 строки.

Пример: Сгенерировать UUID.

> r.uuid().run(conn)

"27961a0e-f4e8-4eb3-bf95-c5203e1d87b9"

Подробнее об этой команде →

Географические команды

circle

r.circle([longitude, latitude], radius[, num_vertices=32, geo_system='WGS84', unit='m', fill=True]) → geometry
r.circle(point, radius[, {num_vertices=32, geo_system='WGS84', unit='m', fill=True]) → geometry

Создаёт круговую линию или многоугольник. Окружность в RethinkDB представляет собой многоугольник или линию, приближающую окружность заданного радиуса вокруг заданного центра, состоящую из заданного количества вершин (по умолчанию 32).

Пример: Определение окружности.

r.table('geo').insert({
    'id': 300,
    'name': 'Hayes Valley',
    'neighborhood': r.circle([-122.423246, 37.779388], 1000)
}).run(conn)

Подробнее об этой команде →

distance

geometry.distance(geometry[, geo_system='WGS84', unit='m']) → number
r.distance(geometry, geometry[, geo_system='WGS84', unit='m']) → number

Вычисляет расстояние между точкой и другим геометрическим объектом. По крайней мере, один из указанных геометрических объектов должен быть точкой.

Пример: Вычисление расстояния между двумя точками на Земле в километрах.

> point1 = r.point(-122.423246, 37.779388)
> point2 = r.point(-117.220406, 32.719464)
> r.distance(point1, point2, unit='km').run(conn)

734.1252496021841

Подробнее об этой команде →

fill

line.fill() → polygon

Преобразует объект типа Line в объект типа Polygon. Если последняя точка не имеет тех же координат, что и первая точка, polygon закроет многоугольник, соединив их.

Пример: Создание объекта типа линия и его преобразование в многоугольник.

r.table('geo').insert({
    'id': 201,
    'rectangle': r.line(
        [-122.423246, 37.779388],
        [-122.423246, 37.329898],
        [-121.886420, 37.329898],
        [-121.886420, 37.779388]
    )
}).run(conn)

r.table('geo').get(201).update({
    'rectangle': r.row['rectangle'].fill()
}, non_atomic=True).run(conn)

Подробнее об этой команде →

geojson

r.geojson(geojson) → geometry

Преобразует объект GeoJSON в геометрический объект ReQL.

Пример: Преобразование объекта GeoJSON в геометрический объект ReQL.

geo_json = {
    'type': 'Point',
    'coordinates': [ -122.423246, 37.779388 ]
}
r.table('geo').insert({
    'id': 'sfo',
    'name': 'San Francisco',
    'location': r.geojson(geo_json)
}).run(conn)

Подробнее об этой команде →

to_geojson

geometry.to_geojson() → object

Преобразует геометрический объект ReQL в объект GeoJSON.

Пример: Преобразование геометрического объекта ReQL в объект GeoJSON.

> r.table('geo').get('sfo')['location'].to_geojson().run(conn)

{
    'type': 'Point',
    'coordinates': [ -122.423246, 37.779388 ]
}

Подробнее об этой команде →

get_intersecting

table.get_intersecting(geometry, index='indexname') → selection<stream>

Возвращает все документы, где заданный геометрический объект пересекается с геометрическим объектом запрошенного геопространственного индекса.

Пример: Какие из мест в списке парков пересекаются с circle1?

circle1 = r.circle([-117.220406, 32.719464], 10, unit='mi')
r.table('parks').get_intersecting(circle1, index='area').run(conn)

Подробнее об этой команде →

get_nearest

table.get_nearest(point, index='indexname'[, max_results=100, max_dist=100000, unit='m', geo_system='WGS84']) → array

Возвращает список документов, ближайших к заданной точке, на основе геопространственного индекса, отсортированных по возрастанию расстояния.

Пример: Возвращает список из 25 ближайших вражеских укрытий к секретной базе.

secret_base = r.point(-122.422876, 37.777128)
r.table('hideouts').get_nearest(secret_base, index='location',
    max_results=25).run(conn)

Подробнее об этой команде →

includes

sequence.includes(geometry) → sequence
geometry.includes(geometry) → bool

Проверяет, полностью ли один геометрический объект содержится в другом. При применении к последовательности геометрических объектов, includes действует как фильтр, возвращая последовательность объектов из последовательности, которые включают аргумент.

Пример: Включается ли point2 в окружность радиусом 2000 метров вокруг point1?

> point1 = r.point(-117.220406, 32.719464)
> point2 = r.point(-117.206201, 32.725186)
> r.circle(point1, 2000).includes(point2).run(conn)

True

Подробнее об этой команде →

intersects

sequence.intersects(geometry) → sequence
geometry.intersects(geometry) → bool
r.intersects(sequence, geometry) → sequence
r.intersects(geometry, geometry) → bool

Проверяет, пересекаются ли два геометрических объекта. При применении к последовательности геометрических объектов, intersects действует как фильтр, возвращая последовательность объектов из последовательности, которые пересекаются с аргументом.

Пример: Находится ли point2 в пределах круга радиусом 2000 метров вокруг point1?

> point1 = r.point(-117.220406, 32.719464)
> point2 = r.point(-117.206201, 32.725186)
> r.circle(point1, 2000).intersects(point2).run(conn)

True

Подробнее об этой команде →

line

r.line([lon1, lat1], [lon2, lat2], ...) → line
r.line(point1, point2, ...) → line

Создаёт геометрический объект типа Line. Линия может быть задана двумя способами:

  • Два или более массивов из двух элементов, определяющих широту и долготу вершин линии;
  • Два или более объекта Point, определяющих вершины линии.

Пример: Определение линии.

r.table('geo').insert({
    'id': 101,
    'route': r.line([-122.423246, 37.779388], [-121.886420, 37.329898])
}).run(conn)

Подробнее об этой команде →

point

r.point(longitude, latitude) → point

Создаёт геометрический объект типа Point. Точка задаётся двумя числами с плавающей запятой: долготой (−180 до 180) и широтой (−90 до 90) точки на идеальной сфере. См. Поддержку геопространственных данных для получения дополнительной информации о системе координат ReQL.

Пример: Определение точки.

r.table('geo').insert({
    'id': 1,
    'name': 'San Francisco',
    'location': r.point(-122.423246, 37.779388)
}).run(conn)

Подробнее об этой команде →

polygon

r.polygon([lon1, lat1], [lon2, lat2], [lon3, lat3], ...) → polygon
r.polygon(point1, point2, point3, ...) → polygon

Создаёт геометрический объект типа Polygon. Многоугольник может быть задан двумя способами:

  • Три или более массивов из двух элементов, определяющих широту и долготу вершин многоугольника;
  • Три или более объекта Point, определяющих вершины многоугольника.

Пример: Определение многоугольника.

r.table('geo').insert({
    'id': 101,
    'rectangle': r.polygon(
        [-122.423246, 37.779388],
        [-122.423246, 37.329898],
        [-121.886420, 37.329898],
        [-121.886420, 37.779388]
    )
}).run(conn)

Подробнее об этой команде →

polygon_sub

polygon1.polygon_sub(polygon2) → polygon

Используйте polygon2 для «вырезания» отверстия в polygon1. polygon2 должен быть полностью вложен в polygon1 и не должен иметь собственных отверстий (он не должен быть результатом polygon_sub).

Пример: Определение многоугольника с вырезанным отверстием.

outer_polygon = r.polygon(
    [-122.4, 37.7],
    [-122.4, 37.3],
    [-121.8, 37.3],
    [-121.8, 37.7]
)
inner_polygon = r.polygon(
    [-122.3, 37.4],
    [-122.3, 37.6],
    [-122.0, 37.6],
    [-122.0, 37.4]
)
outer_polygon.polygon_sub(inner_polygon).run(conn)

Подробнее об этой команде →

Администрирование

grant

r.grant("username", {"permission": bool[, ...]}) → object
db.grant("username", {"permission": bool[, ...]}) → object
table.grant("username", {"permission": bool[, ...]}) → object

Предоставляет или отменяет разрешения доступа для учётной записи пользователя, глобально или по базам данных/таблицам.

Пример: Предоставление учётной записи пользователя chatapp прав чтения и записи в базе данных users.

> r.db('users').grant('chatapp', {'read': True, 'write': True}).run(conn)

{
    "granted": 1,
    "permissions_changes": [
        {
            "new_val": { "read": true, "write": true },
            "old_val": { null }
        }
    ]

Подробнее об этой команде →

config

table.config() → selection<object>
database.config() → selection<object>

Запрос (чтение и/или обновление) конфигураций для отдельных таблиц или баз данных.

Пример: Получение конфигурации для таблицы users.

r.table('users').config().run(conn)

Подробнее об этой команде →

rebalance

table.rebalance() → object
database.rebalance() → object

Перебалансирует фрагменты таблицы. При вызове на базе данных, все таблицы в этой базе данных будут перебалансированы.

Пример: Перебалансировка таблицы.

r.table('superheroes').rebalance().run(conn)

Подробнее об этой команде →

reconfigure

table.reconfigure(shards=<s>, replicas=<r>[, primary_replica_tag=<t>, dry_run=False, nonvoting_replica_tags=None]) → object
database.reconfigure(shards=<s>, replicas=<r>[, primary_replica_tag=<t>, dry_run=False, nonvoting_replica_tags=None]) → object
table.reconfigure(emergency_repair=<option>, dry_run=False) → object

Переконфигурирует фрагментацию и репликацию таблицы.

Пример: Переконфигурирование таблицы.

r.table('superheroes').reconfigure(shards=2, replicas=1).run(conn)

Подробнее об этой команде →

status

table.status() → selection<object>

Возвращает состояние таблицы.

Пример: Получение состояния таблицы.

r.table('superheroes').status().run(conn)

Подробнее об этой команде →

wait

table.wait([wait_for='all_replicas_ready', timeout=<sec>]) → object
database.wait([wait_for='all_replicas_ready', timeout=<sec>]) → object
r.wait(table | database, [wait_for='all_replicas_ready', timeout=<sec>]) → object

Ожидает готовности таблицы или всех таблиц в базе данных. Таблица может быть временно недоступна после создания, перебалансировки или переконфигурации. Команда wait блокируется до тех пор, пока данная таблица (или база данных) не будет полностью обновлена.

Пример: Ожидание готовности таблицы.

r.table('superheroes').wait().run(conn)

{"ready": 1}

Подробнее об этой команде →

Улучшить этот документ

Помогите нам улучшить этот документ.

  • Помогите нам улучшить документацию редактированием этого документа
  • Создайте проблему на странице отслеживания проблем документации на GitHub

Получить дополнительную помощь

Мы всегда рады предложениям по улучшению нашей документации или конкретным вопросам по ReQL.

  • Задайте вопрос на Stack Overflow
  • Пообщайтесь с нами и нашей сообществом в Slack
  • Поговорите с командой в #rethinkdb@freenode.net — через Webchat
  • Создайте проблему в нашем отслеживателе проблем на GitHub
  • Подпишитесь на @rethinkdb в Twitter

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

Spec-Zone.ru

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