Команда ReQL: 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.
Первый аргумент, context, — это объект ReQL, содержащий следующие свойства:
-
primary_key: первичный ключ документа, который удаляется, вставляется или изменяется -
timestamp: объект ReQLtime, представляющий текущее время выполнения запроса
Как и при создании функций вторичных индексов с помощью команды index_create,
r.now()считается недетерминированным и поэтому не разрешается в контексте обработчиков записи. Если вам необходимо сослаться на текущее отметку времени, следует использоватьcontext['timestamp'].
Всякий раз, когда операция записи в таблице вставляет, удаляет или изменяет данный документ, функция обработчика записи вызывается с параметром контекста, старым значением документа (или null при вставке) и новым значением документа (или null при удалении). Затем она возвращает значение, которое должно быть фактически вставлено и/или заменено вместо newVal. Она также может вернуть r.error(...) для прерывания записи.
Для простоты функция обработчика записи разрешена возвращать null только тогда и только тогда, когда newVal является null. Это просто мера предосторожности, чтобы случайно не превратить вставку/обновление в удаление или удаление в обновление.
При успешном выполнении set_write_hook возвращает объект следующего вида:
{
"function": <binary>,
"query": "setWriteHook(function(_var1, _var2, _var3) { return ...; })",
}
Пример: Создайте обработчик записи, который устанавливает modified_at на текущее время при каждой операции записи.
r.table('comments').set_write_hook(lambda context, old_val, new_val:
new_val.merge({
'modified_at': context['timestamp']
})
).run(conn)
Пример: Удалите обработчик записи, связанный с таблицей comments.
r.table('comments').set_write_hook(None).run(conn)
Пример: Воссоздайте устаревший обработчик записи в таблице.
r.table('posts').get_write_hook().do(lambda write_hook:
r.table('posts').set_write_hook(write_hook['function'])
}).run(conn)
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/python/set_write_hook/