← Cloudflare Durable Objects / durable-objects / api
Хранилище Durable Object на основе SQLite
Durable Object Storage API позволяет Durable Objects для доступа к транзакционному и строго согласованному хранилищу. Хранилище, привязанное к Durable Object, доступно только его уникальному экземпляру и недоступно другим объектам.
Durable Object Storage API включает несколько методов: SQL, восстановление на момент времени (PITR), ключ-значение (KV) и alarm API. Доступные методы API зависят от бэкенда хранилища класса Durable Objects: либо SQLite или KV.
| Методы 1 | класс Durable Object на основе SQLite | Класс Durable Object на основе KV |
|---|---|---|
| SQL API | ✅ | ❌ |
| PITR API | ✅ | ❌ |
| Синхронный KV API | ✅ 2, 3 | ❌ |
| Асинхронный KV API | ✅ 3 | ✅ |
| Alarms API | ✅ | ✅ |
Сноски
1 Каждый метод неявно оборачивается в транзакцию, поэтому его результаты атомарны и изолированы от всех остальных операций хранилища, даже при обращении к нескольким парам «ключ-значение».
2 методы KV API, такие как get(), put(), delete(), или list() хранят
данные в скрытой таблице SQLite __cf_kv. Обратите внимание: эта таблица будет отображаться при перечислении всех таблиц, но доступ к её содержимому через SQL API получить не удастся.
3 Durable Objects на основе SQLite также используют синхронные методы API KV с помощью ctx.storage.kv, тогда как Durable Object на основе KV предоставляют только асинхронные методы KV API.
Доступ к хранилищу
Durable Objects получают доступ к Storage API через DurableObjectStorage интерфейс и доступен через DurableObjectState::storage свойство. К нему часто обращаются через this.ctx.storage на ctx параметр, передаваемый в конструктор Durable Object.
Следующий фрагмент кода показывает, как сохранять и получать данные с помощью Durable Object Storage API.
export class Counter extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async increment() {
let value = (await this.ctx.storage.get("value")) || 0;
value += 1;
await this.ctx.storage.put("value", value);
return value;
}
}export class Counter extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async increment(): Promise<number> {
let value: number = (await this.ctx.storage.get('value')) || 0;
value += 1;
await this.ctx.storage.put('value', value);
return value;
}
}from workers import DurableObject
class Counter(DurableObject):
def __init__(self, ctx, env):
super().__init__(ctx, env)
async def increment(self):
value = (await self.ctx.storage.get('value')) or 0
value += 1
await self.ctx.storage.put('value', value)
return valueJavaScript является однопоточным, событийно-ориентированным языком программирования. Это означает, что среды выполнения JavaScript по умолчанию допускают чередование запросов друг с другом, что может приводить к ошибкам параллелизма. Среда выполнения Durable Objects использует сочетание входные шлюзы и выходные шлюзы, чтобы избежать такого рода ошибок конкурентного доступа при выполнении операций с хранилищем. Подробнее в нашем запись в блоге ↗.
SQL API
SqlStorage интерфейс инкапсулирует методы изменения базы данных SQLite, встроенной в Durable Object. SqlStorage интерфейс доступен через sql свойство DurableObjectStorage в качестве класса.
Например, с помощью sql.exec() пользователь может создать таблицу и вставить строки.
import { DurableObject } from "cloudflare:workers";
export class MyDurableObject extends DurableObject {
sql: SqlStorage;
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
this.sql = ctx.storage.sql;
this.sql.exec(`
CREATE TABLE IF NOT EXISTS artist(
artistid INTEGER PRIMARY KEY,
artistname TEXT
);
INSERT INTO artist (artistid, artistname) VALUES
(123, 'Alice'),
(456, 'Bob'),
(789, 'Charlie');
`);
}
}from workers import DurableObject
class MyDurableObject(DurableObject):
def __init__(self, ctx, env):
super().__init__(ctx, env)
self.sql = ctx.storage.sql
self.sql.exec("""
CREATE TABLE IF NOT EXISTS artist(
artistid INTEGER PRIMARY KEY,
artistname TEXT
);
INSERT INTO artist (artistid, artistname) VALUES
(123, 'Alice'),
(456, 'Bob'),
(789, 'Charlie');
""")- Методы SQL API, доступные через
ctx.storage.sqlразрешены только на классы Durable Object с бэкендом хранения SQLite и вернёт ошибку при вызове для классов Durable Object с бэкендом хранилища KV. - При записи данных каждое обновление строки индекса учитывается как дополнительная строка. Однако индексы могут быть полезны в сценариях с интенсивным чтением. См. Индекс для Durable Objects на SQLite.
- Запись данных в виртуальные таблицы SQLite ↗ также учитывается в числе записанных строк.
Durable Objects поддерживают подмножество расширений SQLite для дополнительной функциональности, включая:
- Модуль FTS5 ↗ для полнотекстового поиска (включая
fts5vocab). - Расширение JSON ↗ документацию по функциям и операторам JSON.
- Математические функции ↗.
См. исходный код ↗ с полным списком поддерживаемых функций.
exec
exec(query: : string, ...bindings: any[])SqlStorageCursor
Параметры
query:string- Строка SQL-запроса, которая будет выполнена.
queryможет содержать?плейсхолдеры для привязки параметров. Несколько SQL-выражений, разделённых точкой с запятой, можно выполнить вquery. Если SQL-выражений несколько, любые привязки параметров применяются к последнему SQL-выражению вquery, а возвращённый курсор относится только к последнему SQL-запросу.
- Строка SQL-запроса, которая будет выполнена.
...bindings:any[]Необязательно- Необязательное переменное количество аргументов, соответствующих
?плейсхолдеры вquery.
- Необязательное переменное количество аргументов, соответствующих
Возвращает
Курсор (SqlStorageCursor) для итерации по результатам строк запроса в виде объектов. SqlStorageCursor является JavaScript Iterable ↗, который поддерживает итерацию с помощью for (let row of cursor). SqlStorageCursor также является JavaScript Iterator ↗, который поддерживает итерацию с помощью cursor.next().
SqlStorageCursor поддерживает следующие методы:
next()- Возвращает объект, представляющий следующее значение курсора. Этот объект содержит
doneиvalueсвойства, соответствующие спецификации JavaScript Iterator ↗.doneимеет значениеfalseкогда доступно следующее значение, иvalueустанавливается в следующий объект строки результата запроса.doneимеет значениеtrueкогда весь курсор исчерпан, и никакогоvalueзадан.
- Возвращает объект, представляющий следующее значение курсора. Этот объект содержит
toArray()- Проходит по оставшимся значениям курсора и возвращает массив полученных объектов строк.
one()- Возвращает объект строки, если результат запроса содержит ровно одну строку. Если результат запроса содержит ноль строк или больше одной строки,
one()выбрасывает исключение.
- Возвращает объект строки, если результат запроса содержит ровно одну строку. Если результат запроса содержит ноль строк или больше одной строки,
raw():Iterator- Возвращает Iterator по тем же результатам запроса, где каждая строка представлена в виде массива значений столбцов (без имён столбцов) вместо объекта.
- Возвращённый Iterator поддерживает
next()иtoArray()методы, описанные выше. - Возвращённый курсор и
raw()итераторы проходят по одним и тем же результатам запроса и могут комбинироваться. Например:
let cursor = this.sql.exec("SELECT * FROM artist ORDER BY artistname ASC;");
let rawResult = cursor.raw().next();
if (!rawResult.done) {
console.log(rawResult.value); // prints [ 123, 'Alice' ]
} else {
// query returned zero results
}
console.log(cursor.toArray()); // prints [{ artistid: 456, artistname: 'Bob' },{ artistid: 789, artistname: 'Charlie' }]cursor = self.sql.exec("SELECT * FROM artist ORDER BY artistname ASC;")
raw_result = cursor.raw().next()
if not raw_result.done:
print(raw_result.value) # prints [ 123, 'Alice' ]
else:
# query returned zero results
pass
print(cursor.toArray()) # prints [{ artistid: 456, artistname: 'Bob' },{ artistid: 789, artistname: 'Charlie' }]SqlStorageCursor имеет следующие свойства:
columnNames:string[]- Имена столбцов запроса в том порядке, в котором они появляются в каждом массиве строк, возвращаемом
rawитератор.
- Имена столбцов запроса в том порядке, в котором они появляются в каждом массиве строк, возвращаемом
rowsRead:number- Число строк, прочитанных на данный момент в рамках этого SQL
query. Это значение может увеличиваться по мере перебора курсора. Итоговое значение используется для Тарификация SQL.
- Число строк, прочитанных на данный момент в рамках этого SQL
rowsWritten:number- Число строк, записанных на данный момент в рамках этого SQL
query. Это значение может увеличиваться по мере перебора курсора. Итоговое значение используется для Тарификация SQL.
- Число строк, записанных на данный момент в рамках этого SQL
- На любое числовое значение в столбце влияет 52-битная точность чисел в JavaScript. Если вы сохраните очень большое число (в
int64), а затем получить то же значение, возвращённое значение может быть менее точным, чем исходное число.
Примеры
SQL API примеры ниже используют следующую схему SQL:
import { DurableObject } from "cloudflare:workers";
export class MyDurableObject extends DurableObject {
sql: SqlStorage
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
this.sql = ctx.storage.sql;
this.sql.exec(`CREATE TABLE IF NOT EXISTS artist(
artistid INTEGER PRIMARY KEY,
artistname TEXT
);INSERT INTO artist (artistid, artistname) VALUES
(123, 'Alice'),
(456, 'Bob'),
(789, 'Charlie');`
);
}
}Переберите результаты запроса как объекты строк:
let cursor = this.sql.exec("SELECT * FROM artist;");
for (let row of cursor) {
// Iterate over row object and do something
}Преобразование результатов запроса в массив объектов строк:
// Return array of row objects: [{"artistid":123,"artistname":"Alice"},{"artistid":456,"artistname":"Bob"},{"artistid":789,"artistname":"Charlie"}]
let resultsArray1 = this.sql.exec("SELECT * FROM artist;").toArray();
// OR
let resultsArray2 = Array.from(this.sql.exec("SELECT * FROM artist;"));
// OR
let resultsArray3 = [...this.sql.exec("SELECT * FROM artist;")]; // JavaScript spread syntaxПреобразование результатов запроса в массив массивов значений строк:
// Returns [[123,"Alice"],[456,"Bob"],[789,"Charlie"]]
let cursor = this.sql.exec("SELECT * FROM artist;");
let resultsArray = cursor.raw().toArray();
// Returns ["artistid","artistname"]
let columnNameArray = this.sql.exec("SELECT * FROM artist;").columnNames.toArray();Получить объект первой строки результатов запроса:
// Returns {"artistid":123,"artistname":"Alice"}
let firstRow = this.sql.exec("SELECT * FROM artist ORDER BY artistname DESC;").toArray()[0];Проверьте, что результат запроса содержит ровно одну строку:
// returns error
this.sql.exec("SELECT * FROM artist ORDER BY artistname ASC;").one();
// returns { artistid: 123, artistname: 'Alice' }
let oneRow = this.sql.exec("SELECT * FROM artist WHERE artistname = ?;", "Alice").one()Поведение возвращённого курсора:
let cursor = this.sql.exec("SELECT * FROM artist ORDER BY artistname ASC;");
let result = cursor.next();
if (!result.done) {
console.log(result.value); // prints { artistid: 123, artistname: 'Alice' }
} else {
// query returned zero results
}
let remainingRows = cursor.toArray();
console.log(remainingRows); // prints [{ artistid: 456, artistname: 'Bob' },{ artistid: 789, artistname: 'Charlie' }]Возвращённый курсор и raw() итераторы проходят по одним и тем же результатам запроса:
let cursor = this.sql.exec("SELECT * FROM artist ORDER BY artistname ASC;");
let result = cursor.raw().next();
if (!result.done) {
console.log(result.value); // prints [ 123, 'Alice' ]
} else {
// query returned zero results
}
console.log(cursor.toArray()); // prints [{ artistid: 456, artistname: 'Bob' },{ artistid: 789, artistname: 'Charlie' }]sql.exec().rowsRead():
let cursor = this.sql.exec("SELECT * FROM artist;");
cursor.next()
console.log(cursor.rowsRead); // prints 1
cursor.toArray(); // consumes remaining cursor
console.log(cursor.rowsRead); // prints 3databaseSize
databaseSize: number
Возвращает
Текущий размер базы данных SQLite в байтах.
let size = ctx.storage.sql.databaseSize;size = ctx.storage.sql.databaseSizePITR (Point In Time Recovery) API
Для Durable Objects на основе SQLite, доступны следующие методы API восстановления на определённый момент времени (PITR) для восстановления встроенной базы данных SQLite Durable Object на любой момент времени за последние 30 дней. Эти методы применяются ко всему содержимому базы данных SQLite, включая как хранимые SQL-данные объекта, так и хранимые данные ключ-значение с использованием put() API. PITR API не поддерживается при локальной разработке, так как журнал изменений данных не сохраняется локально.
PITR API представляет моменты времени с помощью «закладок» (bookmark). Закладка представляет собой в основном буквенно-числовую строку вида 0000007b-0000b26e-00001538-0c3e87bb37b3db5cc52eedb93cd3b96b. Закладки спроектированы так, чтобы их можно было сравнивать лексически: закладка, соответствующая более раннему моменту времени, оказывается меньше закладки, соответствующей более позднему моменту, при обычном сравнении строк.
getCurrentBookmark
ctx.storage.getCurrentBookmark(): Promise<string>
- Возвращает bookmark, представляющий текущий момент времени в истории объекта.
getBookmarkForTime
ctx.storage.getBookmarkForTime(timestamp: : number | Date)Promise<string>
- Возвращает bookmark, приблизительно соответствующий указанному моменту времени, который должен находиться в пределах последних 30 дней. Если временная метка указана в виде числа, она преобразуется в дату так, как если бы использовался
new Date(timestamp).
onNextSessionRestoreBookmark
ctx.storage.onNextSessionRestoreBookmark(bookmark: : string)Promise<string>
- Настраивает Durable Object таким образом, чтобы при следующем перезапуске он восстановил хранилище в точности до состояния, зафиксированного в указанной закладке. После вызова этого метода приложению обычно следует вызвать
ctx.abort()чтобы перезапустить Durable Object и тем самым завершить восстановление на заданный момент времени.
Этот метод возвращает специальную закладку (bookmark), которая обозначает момент времени непосредственно перед восстановлением (хотя формально этот момент ещё находится в будущем). Поэтому после завершения восстановления его можно отменить, выполнив повторное восстановление до этой закладки.
const DAY_MS = 24*60*60*1000;
// restore to 2 days ago
let bookmark = ctx.storage.getBookmarkForTime(Date.now() - 2 * DAYS_MS);
ctx.storage.onNextSessionRestoreBookmark(bookmark);from datetime import datetime, timedelta
now = datetime.now()
# restore to 2 days ago
bookmark = ctx.storage.getBookmarkForTime(now - timedelta(days=2))
ctx.storage.onNextSessionRestoreBookmark(bookmark)Синхронный KV API
get
ctx.storage.kv.get(key:string)Any, undefined- Возвращает значение, связанное с указанным ключом. Тип возвращаемого значения соответствует тому, что было ранее записано для этого ключа, либо undefined, если ключ не существует.
put
ctx.storage.kv.put(key:string, valueany)void-
Сохраняет значение и связывает его с указанным ключом. Значение может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, что верно для большинства типов.
О размере ключей и значений см. лимиты Durable Object на основе SQLite
-
delete
ctx.storage.kv.delete(key:string)boolean- Удаляет ключ и связанное с ним значение. Возвращает
true, если ключ существовал, илиfalse, если этого не произошло.
- Удаляет ключ и связанное с ним значение. Возвращает
list
ctx.storage.kv.list(options:Objectoptional)Iterable<string, any>-
Возвращает все ключи и значения, связанные с текущим Durable Object, отсортированные по возрастанию на основе представления ключей в кодировке UTF-8.
-
Тип каждого возвращаемого значения в
Iterable↗ будет равно тому, что было ранее записано для соответствующего ключа. -
Учитывайте, какой объём данных может храниться в вашем Durable Object, прежде чем вызывать эту версию
listбез параметров, поскольку все данные будут загружены в память Durable Object, что потенциально может привести к достижению лимит. Если это имеет значение, передайте параметры вlistкак описано ниже.
-
Поддерживаемые параметры
-
startstring- Ключ, с которого начинаются результаты списка, включая его.
-
startAfterstring- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
start.
- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
-
endstring- Ключ, на котором заканчиваются результаты списка, не включая его.
-
prefixstring- Ограничивает результаты только теми парами «ключ-значение», ключи которых начинаются с указанного префикса.
-
reverseboolean- Если значение true, результаты возвращаются в порядке убывания вместо порядка возрастания, используемого по умолчанию.
- Включение
reverseне меняет смыслstart,startKey, илиendKey.startпо-прежнему задаёт наименьший ключ в лексикографическом порядке, который может быть возвращён (включительно), фактически определяя конечную точку списка при обратном порядке сортировки.endпо-прежнему задаёт наибольший ключ в лексикографическом порядке, который должен учитываться при выборке (исключительно), фактически определяя начальную точку списка при обратном порядке сортировки.
-
limitnumber- Максимальное количество пар ключ-значение, которое нужно вернуть.
Асинхронный KV API
get
-
ctx.storage.get(key:string, optionsObjectoptional)Promise<any>- Возвращает значение, связанное с указанным ключом. Тип возвращаемого значения соответствует тому, что было ранее записано для этого ключа, либо undefined, если ключ не существует.
-
ctx.storage.get(keys:Array<string>, optionsObjectoptional)Promise<Map<string, any>>- Возвращает значения, связанные с каждым из указанных ключей. Тип каждого возвращаемого значения в
Map↗ будет равно тому, что было ранее записано для соответствующего ключа. Приводит кMapбудут отсортированы в порядке возрастания их UTF-8 кодировок, при этом запрошенные ключи, которых не существует, будут пропущены. Поддерживается до 128 ключей за раз.
- Возвращает значения, связанные с каждым из указанных ключей. Тип каждого возвращаемого значения в
Поддерживаемые параметры
-
allowConcurrency:boolean- По умолчанию система приостанавливает доставку событий ввода-вывода объекту, пока выполняется операция с хранилищем, чтобы избежать непредвиденных состояний гонки. Передайте
allowConcurrency: trueчтобы отключить это поведение и разрешить доставку параллельных событий.
- По умолчанию система приостанавливает доставку событий ввода-вывода объекту, пока выполняется операция с хранилищем, чтобы избежать непредвиденных состояний гонки. Передайте
-
noCache:boolean- Если значение true, пара ключ-значение не добавляется в кэш в памяти. Если ключ уже есть в кэше, будет возвращено кэшированное значение, однако время его последнего использования не обновится. Используйте этот флаг, если вы не ожидаете повторного использования этого ключа в ближайшее время. Флаг является лишь подсказкой: он никогда не меняет семантику вашего кода, но может повлиять на производительность.
put
-
put(key:string, valueany, optionsObjectoptional)Promise-
Сохраняет значение и связывает его с указанным ключом. Значение может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, что верно для большинства типов.
Ограничения на размер ключей и значений зависят от используемого бэкенда хранилища Durable Object. См. один из следующих материалов:
Если в Durable Object с хранилищем на основе KV сериализованное значение превышает лимит размера 128 KiB (131072 байт),
put()выбрасываетRangeError(например,Values cannot be larger than 131072 bytes.) до применения записи.
-
-
put(entries:Object, optionsObjectoptional)Promise- Принимает объект и сохраняет каждый его ключ и значение в хранилище.
- Каждое значение может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, что верно для большинства типов.
- Одновременно поддерживается до 128 пар «ключ-значение». Размер ключей и значений ограничен по-разному в зависимости от типа используемого Durable Object. См.:
удалить
-
delete(key:string, optionsObjectoptional)Promise<boolean>- Удаляет ключ и связанное с ним значение. Возвращает
true, если ключ существовал, илиfalse, если этого не произошло.
- Удаляет ключ и связанное с ним значение. Возвращает
-
delete(keys:Array<string>, optionsObjectoptional)Promise<number>- Удаляет переданные ключи и связанные с ними значения. Поддерживает до 128 ключей за один вызов. Возвращает количество удалённых пар «ключ-значение».
Поддерживаемые параметры
-
put(),delete()иdeleteAll()поддерживают следующие параметры: -
allowUnconfirmedboolean-
По умолчанию система приостанавливает исходящие сетевые сообщения от Durable Object, пока не будет подтверждено, что все предыдущие записи сброшены на диск. Если запись завершается ошибкой, система сбрасывает объект, отбрасывает все исходящие сообщения и вместо них отвечает клиентам ошибками.
-
Благодаря этому Durable Objects могут продолжать выполняться параллельно с операцией записи, не рискуя преждевременно подтвердить запись, потому что никакая внешняя сторона не может увидеть действия объекта, пока запись действительно не завершится успешно.
-
После любой записи последующие сетевые сообщения могут немного задерживаться. Для некоторых приложений допустимо обмениваться данными на основе неподтверждённых записей. Другие программы могут предпочесть пропускать сетевой трафик немедленно. В этом случае задайте
allowUnconfirmedкtrueчтобы отказаться от поведения по умолчанию. -
Если вы хотите, чтобы одни исходящие сетевые сообщения отправлялись немедленно, а другие нет, используйте опцию allowUnconfirmed, чтобы не блокировать нужные сообщения, а затем отдельно вызовите
sync()метод, который возвращает промис, разрешающийся только после того, как все предыдущие операции записи будут успешно сохранены на диск.
-
-
noCacheboolean-
Если значение true, пара ключ-значение удаляется из памяти сразу после завершения записи на диск.
-
Используйте
noCache, если ключ не понадобится в ближайшем будущем.noCacheникогда не изменит семантику вашего кода, но может повлиять на производительность. -
Если вы используете
get()чтобы получить ключ до завершения записи, будет возвращена копия из буфера записи, что обеспечивает согласованность с последним вызовомput().
-
список
list(options:Objectoptional)Promise<Map<string, any>>-
Возвращает все ключи и значения, связанные с текущим Durable Object, отсортированные по возрастанию на основе представления ключей в кодировке UTF-8.
-
Тип каждого возвращаемого значения в
Map↗ будет равно тому, что было ранее записано для соответствующего ключа. -
Учитывайте, какой объём данных может храниться в вашем Durable Object, прежде чем вызывать эту версию
listбез параметров, поскольку все данные будут загружены в память Durable Object, что потенциально может привести к достижению лимит. Если это имеет значение, передайте параметры вlistкак описано ниже.
-
Поддерживаемые параметры
-
startstring- Ключ, с которого начинаются результаты списка, включая его.
-
startAfterstring- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
start.
- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
-
endstring- Ключ, на котором заканчиваются результаты списка, не включая его.
-
prefixstring- Ограничивает результаты только теми парами «ключ-значение», ключи которых начинаются с указанного префикса.
-
reverseboolean- Если значение true, результаты возвращаются в порядке убывания вместо порядка возрастания, используемого по умолчанию.
- Включение
reverseне меняет смыслstart,startKey, илиendKey.startпо-прежнему задаёт наименьший ключ в лексикографическом порядке, который может быть возвращён (включительно), фактически определяя конечную точку списка при обратном порядке сортировки.endпо-прежнему задаёт наибольший ключ в лексикографическом порядке, который должен учитываться при выборке (исключительно), фактически определяя начальную точку списка при обратном порядке сортировки.
-
limitnumber- Максимальное количество пар ключ-значение, которое нужно вернуть.
-
allowConcurrencyboolean- То же, что и возможность
get(), выше.
- То же, что и возможность
-
noCacheboolean- То же, что и возможность
get(), выше.
- То же, что и возможность
Будильники
getAlarm
getAlarm(options:Objectoptional)Promise<Number | null>- Возвращает текущее время будильника (если оно задано) в виде целого числа миллисекунд с начала эпохи. Будильник считается заданным, если он ещё не сработал либо если он завершился ошибкой и повторная попытка ещё не началась. Если будильник не задан,
getAlarm()возвращаетnull.
- Возвращает текущее время будильника (если оно задано) в виде целого числа миллисекунд с начала эпохи. Будильник считается заданным, если он ещё не сработал либо если он завершился ошибкой и повторная попытка ещё не началась. Если будильник не задан,
Поддерживаемые параметры
- Такие же параметры, как и
get(), но безnoCache.
setAlarm
-
setAlarm(scheduledTime:Date | number, optionsObjectoptional)Promise- Задаёт текущее время будильника, принимая либо JavaScript
Date, или целое число миллисекунд с начала эпохи.
Если
setAlarm()вызывается с временем, равным или предшествующимDate.now(), будильник будет запланирован на асинхронное выполнение в ближайшее время. Если обработчик будильника в этот момент уже выполняется, он не будет отменён. Будильники можно устанавливать с точностью до миллисекунды, и обычно они срабатывают в течение нескольких миллисекунд после установленного времени, но могут задерживаться до минуты из-за обслуживания или сбоев во время отказоустойчивого переключения. - Задаёт текущее время будильника, принимая либо JavaScript
deleteAlarm
deleteAlarm(options:Objectoptional)Promise- Удаляет будильник, если он установлен. Не отменяет выполнение обработчика будильника, если он уже запущен.
Поддерживаемые параметры
setAlarm()иdeleteAlarm()поддерживают те же параметры, что иput(), но безnoCache.
Прочее
deleteAll
deleteAll(options:Objectoptional)Promise- Удаляет все сохранённые данные, фактически освобождая всё хранилище, используемое Durable Object. Для Durable Objects с хранилищем типа «ключ-значение»,
deleteAll()удаляет все ключи и связанные с ними значения для отдельного Durable Object. Для Durable Object с Хранилище на основе SQLite,deleteAll()полностью удаляет содержимое приватной базы данных SQLite объекта Durable Object, включая данные SQL и данные в формате ключ-значение. - Для Durable Objects с бэкендом хранилища на основе ключ-значение выполняющаяся
deleteAll()операция может завершиться неудачей, из-за чего часть данных может остаться неудалённой. У Durable Objects с бэкендом хранилища SQLite не бывает частичногоdeleteAll()проблема, потому чтоdeleteAll()операции атомарны (выполняются полностью либо не выполняются вовсе). - Для Workers с датой совместимости
2026-02-24или более поздней версии,deleteAll()также удаляет все активные оповещение. Для более ранних дат совместимостиdeleteAll()не удаляет будильники. ИспользуйтеdeleteAlarm()отдельно либо включитьdelete_all_deletes_alarmфлаг совместимости.
- Удаляет все сохранённые данные, фактически освобождая всё хранилище, используемое Durable Object. Для Durable Objects с хранилищем типа «ключ-значение»,
transactionSync
transactionSync(callback):any-
Доступно только при использовании Durable Object с хранилищем SQLite.
-
Вызывает
callback()обернутый в транзакцию, и возвращает её результат. -
Если
callback()выбрасывает исключение, транзакция будет отменена. -
Обратный вызов должен завершаться синхронно, то есть он не должен быть объявлен как
asyncи не должны каким-либо иным образом возвращать Promise. Частью транзакции могут быть только синхронные операции с хранилищем. Это предназначено для использования с SQL-запросами черезctx.storage.sql.exec(), которые выполняются синхронно.
-
transaction
-
transaction(closureFunction(txn)):Promise-
Выполняет последовательность операций хранения, вызванных для
txnв рамках одной транзакции, которая либо успешно фиксируется, либо отменяется. -
Явные транзакции больше не требуются. Любая последовательность операций записи без промежуточного
awaitбудут автоматически отправлены атомарно, а система не позволит параллельным событиям выполняться, покаawaitоперация чтения (если не используетсяallowConcurrency: true). Поэтому серия операций чтения, за которой следует серия операций записи (без другого промежуточного ввода-вывода), автоматически становится атомарной и ведёт себя как транзакция.
-
-
txn-
Предоставляет доступ к
put(),get(),delete(), а такжеlist()методы, описанные выше, для выполнения в текущем контексте транзакции. Чтобы получить транзакционное поведение внутри замыкания транзакции, вызывайте методы наtxnObject, а не на верхнем уровнеctx.storageObject.
Также поддерживаетrollback()-функция, которая гарантирует, что все изменения, внесённые в рамках транзакции, будут отменены, а не зафиксированы. Послеrollback()вызывается, любые последующие операции сtxnObject завершится с исключением.rollback()не принимает параметров и не возвращает вызывающей стороне никакого значения. -
При использовании движок хранения на основе SQLite,
txnобъект устарел. Любые операции с хранилищем, выполняемые напрямую черезctx.storageобъект, включая SQL-запросы черезctx.storage.sql.exec(), будут считаться частью транзакции.
-
sync
sync():Promise-
Синхронизирует все отложенные записи на диск.
-
Это похоже на обычное поведение при автоматическом объединении записей (write coalescing). Если в буфере записи есть ожидающие записи (в том числе отправленные с помощью
allowUnconfirmedпараметр), возвращаемый promise будет разрешён, когда они завершатся. Если отложенных записей нет, возвращаемый promise уже будет разрешён.
-
Свойства хранилища
sql
sql является доступным только для чтения свойством типа DurableObjectStorage инкапсулирующий SQL API.