High-level, type-safe YQL query and transaction client for YDB. Supports tagged template syntax, parameter binding, transactions, and statistics.
npm install @ydbjs/queryЧитать на английском: README.md
@ydbjs/query — высокоуровневый, типобезопасный клиент для выполнения YQL‑запросов и управления транзакциями в YDB. Поддерживает теговый шаблонный синтаксис, автоматическое связывание параметров, хелперы транзакций и глубокую интеграцию с типовой системой YDB.
- Теговый шаблонный синтаксис для YQL
- Типобезопасное связывание параметров (включая сложные/вложенные типы)
- Транзакции с настройками изоляции и идемпотентности
- Несколько результирующих наборов и стриминг
- Статистика выполнения и диагностика
- Полные типы TypeScript
``sh`
npm install @ydbjs/core@alpha @ydbjs/query@alpha
- Query‑клиент: создайте клиент query(driver). Он возвращает теговую функцию для YQL и хелперы транзакций.begin
- Сессии и транзакции: управление жизненным циклом выполняется автоматически. Можно запускать одиночные запросы или объединять несколько запросов в транзакцию через /transaction.${}
- Параметры: параметры передаются через интерполяцию () в шаблоне. Поддерживаются нативные типы JS, классы значений YDB и массивы/объекты. Для именованных параметров используйте .parameter()/.param().@ydbjs/value
- Безопасность типов: все значения конвертируются с помощью . Сложные и вложенные типы обрабатываются автоматически..withStats()
- Результаты: YDB может возвращать несколько наборов результатов за один запрос.
- Статистика: используйте или .stats() для доступа к статистике выполнения.
`ts
import { Driver } from '@ydbjs/core'
import { query } from '@ydbjs/query'
const driver = new Driver('grpc://localhost:2136/local')
await driver.ready()
const sql = query(driver)
const resultSets = await sqlSELECT 1 + 1 AS sum`
console.log(resultSets) // [ [ { sum: 2 } ] ]
`ts
const userId = 42n
const userName = 'Alice'
await sql
SELECT * FROM users
WHERE id = ${userId} AND name = ${userName}`
#### Именованные параметры и кастомные типы
`tsSELECT * FROM users WHERE id = $id
import { Uint64 } from '@ydbjs/value/primitive'
const id = new Uint64(123n)
await sql.parameter('id', id)`
#### Массивы, структуры и табличные параметры
`tsINSERT INTO users SELECT * FROM AS_TABLE(${users})
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
]
await sql`
`tsUPDATE users SET active = false WHERE last_login < CurrentUtcTimestamp() - Interval('P1Y')
// Serializable read-write (по умолчанию)
const result = await sql.begin(async (tx) => {
await txSELECT * FROM users WHERE active = false
return await tx
})
// С изоляцией и идемпотентностью
await sql.begin({ isolation: 'snapshotReadOnly', idempotent: true }, async (tx) => {
return await txSELECT COUNT(*) FROM users`
})
`tsSELECT id FROM users; SELECT COUNT(*) as count FROM users;
import { StatsMode } from '@ydbjs/api/query'
// Несколько наборов результатов
type Result = [[{ id: number }], [{ count: number }]]
const [rows, [{ count }]] = await sql
// Подписка на статистику и ретраи
const q = sqlSELECT * FROM users.withStats(StatsMode.FULL)`
q.on('stats', (stats) => console.log('Query stats:', stats))
q.on('retry', (ctx) => console.log('Retrying:', ctx))
await q
`tsSELECT * FROM non_existent_table
import { YDBError } from '@ydbjs/error'
try {
await sql`
} catch (e) {
if (e instanceof YDBError) {
console.error('YDB Error:', e.message)
}
}
`tsSELECT * FROM users
import { StatsMode } from '@ydbjs/api/query'
await sql`
.isolation('onlineReadOnly', { allowInconsistentReads: true })
.idempotent(true)
.timeout(5000)
.withStats(StatsMode.FULL)
Внимание: эти опции действуют только для одиночных запросов (один вызов execute). Внутри транзакций (sql.begin/sql.transaction) они игнорируются.
Все значения конвертируются с помощью @ydbjs/value. См. документацию @ydbjs/value по типам и правилам конвертации. Можно передавать нативные типы JS или использовать классы YDB для полного контроля.
`tsSELECT * FROM users WHERE meta = ${fromJs({ foo: 'bar' })}
import { fromJs } from '@ydbjs/value'
await sql`
`tsSELECT * FROM users
import { StatsMode } from '@ydbjs/api/query'
const q = sql.withStats(StatsMode.FULL)`
await q
console.log(q.stats())
- Динамические имена таблиц/колонок — используйте идентификаторы:
`tsSELECT * FROM ${sql.identifier('users')}
// Метод клиента
await sql
// Или импорт из пакета
import { identifier } from '@ydbjs/query'
await sqlSELECT * FROM ${identifier('users')}`
- Небезопасные фрагменты — только для доверенных сценариев (не с данными пользователя):
`tsSELECT * FROM users ${unsafe('ORDER BY created_at DESC')}
import { unsafe } from '@ydbjs/query'
await sql`
Заметка по безопасности: identifier() лишь экранирует обратные кавычки и оборачивает имя в обратные кавычки. Не передавайте туда непроверенный ввод — используйте валидацию/allow‑list.
`sh`
npm run build
`sh`
npm test
Этот пакет содержит примеры конфигураций для AI‑ассистентов в каталоге ai-instructions/, чтобы генерировать безопасный YQL‑код.
Быстрый старт:
`bashДля Cursor AI
cp node_modules/@ydbjs/query/ai-instructions/.cursorrules.example .cursorrules
См.
SECURITY.md` для полного руководства по безопасности.Проект распространяется по лицензии Apache 2.0.
- Документация YDB: https://ydb.tech
- Репозиторий: https://github.com/ydb-platform/ydb-js-sdk
- Issues: https://github.com/ydb-platform/ydb-js-sdk/issues