Skip to content

API базы данных ​

Объект базы данных, возвращаемый createDrizzle(), является основным интерфейсом взаимодействия. Он объединяет возможности построителей запросов Drizzle с функциональностью YDB.

Runnable-приложение, которое покрывает большинство методов этой страницы, находится в разделе Примеры Drizzle Adapter.

Инициализация ​

Функция createDrizzle (алиас drizzle) — точка входа для создания экземпляра базы данных.

Способы конфигурации ​

  • createDrizzle(options): создает экземпляр по строке подключения или существующему клиенту.
  • createDrizzle(callback, config?): создает экземпляр поверх кастомного callback-исполнителя (полезно для Remote/Proxy конфигураций).

Опции ​

  • connectionString: строка подключения YDB (например, grpc://localhost:2136/local). Адаптер автоматически создает и управляет экземпляром Driver.
  • client: существующий YdbExecutor или YdbTransactionalExecutor.
  • schema: объект со схемами таблиц и связей для работы Relational Query API (db.query.*).
  • logger: true для стандартного логгера, false для отключения или кастомный Logger Drizzle.
  • casing: режим преобразования имен Drizzle ('snake_case' или 'camelCase').

Пример:

ts
import { createDrizzle } from '@ydbjs/drizzle-adapter'

const db = createDrizzle({
  connectionString: process.env['YDB_CONNECTION_STRING']!,
  schema,
  logger: true,
})

Управление жизненным циклом ​

При использовании connectionString адаптер владеет базовым драйвером. Используйте $client для управления его состоянием:

  • await db.$client.ready(): позволяет убедиться, что драйвер инициализирован и база доступна.
  • db.$client.close(): закрывает пул сессий и освобождает ресурсы драйвера. Синхронный; возвращает void. Обязательно вызывайте этот метод при завершении работы приложения.
ts
await db.$client.ready()
// ... логика приложения ...
db.$client.close()

Выполнение запросов ​

Методы для выполнения сырого YQL или объектов-построителей:

МетодОписание
.execute(query)Выполняет запрос и возвращает типизированный результат.
.all(query)Возвращает все строки в виде массива объектов.
.get(query)Возвращает первую найденную строку или undefined.
.values(query)Возвращает данные в виде массива массивов значений.

Пример:

ts
import { sql } from 'drizzle-orm'

await db.execute(sql`DELETE FROM users WHERE id = ${1}`)

const rows = await db.all(sql`SELECT * FROM users`)
const first = await db.get(sql`SELECT * FROM users LIMIT 1`)
const values = await db.values<[number, string]>(sql`SELECT id, name FROM users`)

const firstBuilt = await db.get(db.select({ id: users.id, name: users.name }).from(users).limit(1))

Построители запросов ​

Выборка (SELECT) ​

  • db.select(fields?), db.selectDistinct(fields?), db.selectDistinctOn(on, fields?): инициализация построителей SELECT.
  • db.with(...queries), db.$with(alias): объявление CTE (Common Table Expressions).

Мутации ​

МетодОперация YQLОписание
db.insert(table)INSERT INTOОбычная вставка.
db.upsert(table)UPSERT INTOВставка или обновление по Primary Key.
db.replace(table)REPLACE INTOПолная замена строки.
db.update(table)UPDATEЧастичное обновление.
db.delete(table)DELETE FROMУдаление строк.
db.batchUpdate(table)(оптимизировано)Массовое обновление нескольких строк.
db.batchDelete(table)(оптимизировано)Массовое удаление нескольких строк.

Утилиты ​

  • db.$count(source, filters?): возвращает awaitable count-выражение для эффективного подсчета строк.
ts
import { eq } from 'drizzle-orm'

const activeCount = await db.$count(users, eq(users.active, true))

const rows = await db.select({ id: users.id, name: users.name }).from(users).limit(10).execute()

Транзакции ​

Метод db.transaction() обеспечивает атомарность выполнения группы операций.

ts
await db.transaction(
  async (tx) => {
    await tx.insert(users).values({ id: 1, name: 'Alice' }).execute()
    await tx
      .update(stats)
      .set({ count: sql`count + 1` })
      .execute()

    // Ручной откат
    if (someCondition) {
      tx.rollback()
    }
  },
  {
    accessMode: 'read write',
    isolationLevel: 'serializableReadWrite',
    idempotent: true,
  }
)

Опции ​

  • accessMode: 'read write' (по умолчанию) или 'read only'. Используйте 'read only' для оптимизации читающих транзакций.
  • isolationLevel: 'serializableReadWrite' (рекомендуется для YDB) или 'snapshotReadOnly'.
  • idempotent: если true, адаптер сможет автоматически перезапустить транзакцию при сетевых ошибках.

Relational Query API ​

Если при инициализации была передана schema, доступен высокоуровневый API для работы со связями через db.query.*.

ts
const user = await db.query.users.findFirst({
  where: (u, { eq }) => eq(u.id, 1),
  with: {
    posts: {
      columns: {
        id: true,
        title: true,
      },
      limit: 5,
      orderBy: (p, { desc }) => [desc(p.id)],
    },
    profile: true,
  },
})

Опции ​

  • columns: включение или исключение конкретных колонок.
  • where: логика фильтрации.
  • orderBy: выражения сортировки.
  • limit, offset: пагинация.
  • with: вложенная загрузка связей.
  • extras: дополнительные SQL-выражения.