Команда ReQL: replace
Синтаксис команды
table.replace(object | function[, durability="hard", return_changes=False, non_atomic=False, ignore_write_hook=False]) → object selection.replace(object | function[, durability="hard", return_changes=False, non_atomic=False, ignore_write_hook=False]) → object singleSelection.replace(object | function[, durability="hard", return_changes=False, non_atomic=False, ignore_write_hook=False]) → object
Описание
Заменяет документы в таблице. Принимает JSON-документ или выражение ReQL и заменяет исходный документ новым. Новый документ должен иметь тот же первичный ключ, что и исходный.
Команда replace может использоваться для вставки и удаления документов. Если у «заменённого» документа есть первичный ключ, которого нет в таблице, документ будет вставлен; если существующий документ заменён на None, документ будет удалён. Поскольку update и replace операции выполняются атомарно, это позволяет выполнять атомарные вставки и удаления.
Необязательные аргументы:
-
durability: возможные значенияhardиsoft. Этот параметр переопределяет настройку долговечности таблицы или запроса (установленную в run). В режиме мягкой долговечности RethinkDB подтвердит запись сразу после её получения, но до того, как запись будет сохранена на диск. -
return_changes:-
True: вернуть массивchangesсодержащий объектыold_val/new_val, описывающие внесённые изменения, содержащие только документы, которые были действительно обновлены. -
False: не возвращать массивchanges(по умолчанию). -
"always": вести себя какTrue, но включать все документы, которые команда пыталась обновить, независимо от того, было ли обновление успешным или нет. (Это было поведениеTrueдо версии 2.0.)
-
-
non_atomic: если установлено значениеTrue, выполняет замену и распределяет результат по репликам неатомарным способом. Этот флаг необходим для выполнения недетерминированных обновлений, таких как те, которые требуют чтения данных из другой таблицы. -
ignore_write_hook: ЕслиTrue, и если у пользователя есть разрешение config, игнорирует любой write hook при выполнении замены.
Replace возвращает объект, содержащий следующие атрибуты:
-
replaced: количество документов, которые были заменены. -
unchanged: количество документов, которые были бы изменены, за исключением того, что новое значение было таким же, как старое. -
inserted: количество добавленных новых документов. Документ считается вставленным, если его первичный ключ не существовал в таблице на момент операцииreplace. -
deleted: количество удалённых документов при замене сNone. -
errors: количество ошибок, возникших при выполнении замены. -
first_error: Если возникли ошибки, содержит текст первой ошибки. -
skipped: 0 для операции replace. -
changes: еслиreturn_changesустановлено вTrue, это будет массив объектов, по одному для каждого объекта, затронутого операциейreplace.
Операции записи RethinkDB будут генерировать исключения только в случае ошибок до выполнения каких-либо записей. Другие ошибки будут перечислены в
first_error, иerrorsбудет установлено в ненулевое значение. Для правильной обработки ошибок с этим термином, код должен обрабатывать как исключения, так и проверять возвращаемое значениеerrors!
Пример: Замена документа с первичным ключом 1.
r.table("posts").get(1).replace({
"id": 1,
"title": "Lorem ipsum",
"content": "Aleas jacta est",
"status": "draft"
}).run(conn)
Пример: Удаление поля status из всех постов.
r.table("posts").replace(lambda post:
post.without("status")
).run(conn)
Пример: Удаление всех полей, которые не являются id, title или content.
r.table("posts").replace(lambda post:
post.pluck("id", "title", "content")
).run(conn)
Пример: Замена документа с первичным ключом 1 с использованием мягкой долговечности.
r.table("posts").get(1).replace({
"id": 1,
"title": "Lorem ipsum",
"content": "Aleas jacta est",
"status": "draft"
}, durability="soft").run(conn)
Пример: Замена документа с первичным ключом 1 и возврат значений документа до и после операции замены.
r.table("posts").get(1).replace({
"id": 1,
"title": "Lorem ipsum",
"content": "Aleas jacta est",
"status": "published"
}, return_changes=True).run(conn)
Результат будет содержать поле changes:
{
"deleted": 0,
"errors": 0,
"inserted": 0,
"changes": [
{
"new_val": {
"id":1,
"title": "Lorem ipsum"
"content": "Aleas jacta est",
"status": "published",
},
"old_val": {
"id":1,
"title": "Lorem ipsum"
"content": "TODO",
"status": "draft",
"author": "William",
}
}
],
"replaced": 1,
"skipped": 0,
"unchanged": 0
}
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/python/replace/