Типобезопасное построение запросов
Создавайте запросы, отклоняющие недопустимые столбцы во время компиляции
«Типобезопасное построение запросов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Запросы, не допускающие ссылки на неизвестные столбцы
Безопасный с точки зрения типов построитель запросов отклоняет имена столбцов, которых нет в таблице, на этапе компиляции. Вы ссылаетесь на столбцы через типизированные объекты, а не через обычные строки.
Типизированные ссылки на столбцы
После определения таблицы каждый столбец становится свойством объекта таблицы. Для фильтров и выборок передаются именно эти свойства, а не строки.
import { eq } from "drizzle-orm";
// users.id and users.name are typed column objects
const rows = await db
.select()
.from(users)
.where(eq(users.id, 1));Неизвестный столбец = ошибка компиляции
Поскольку столбцы являются настоящими свойствами, опечатка обнаруживается немедленно. Обходного пути через строки без типизации нет.
await db.select().from(users).where(eq(users.idd, 1));
// ^^^^
// Error: Property "idd" does not exist on the users table.Типизированные операнды сравнения
Операторы вроде eq обобщены по типу столбца. Сравнение числового столбца со строкой является ошибкой типов.
eq(users.age, 30); // ok: age is number
eq(users.age, "thirty"); // Error: string is not assignable to numberВыбор отдельных столбцов
Передайте объект, значения которого являются ссылками на столбцы, чтобы выбрать подмножество данных. Выбранные ключи станут ключами результата.
const partial = await db
.select({ id: users.id, name: users.name })
.from(users);
// result rows: { id: number; name: string }[]Отклонение столбцов из других таблиц
Карта select ограничена столбцами запрашиваемой таблицы или таблиц. Ссылка на столбец несвязанной таблицы приводит к ошибке компиляции.
await db
.select({ title: posts.title }) // posts not in this query
.from(users);
// Error: posts.title is not part of the FROM clause.Комбинируемые условия
Условия объединяются с помощью and, or, not. Каждый фрагмент сохраняет типизацию, поэтому некорректное условие обнаруживается даже глубоко внутри дерева.
import { and, gt, eq } from "drizzle-orm";
const q = db.select().from(users).where(
and(gt(users.age, 18), eq(users.isAdmin, false))
);Сортировка и ограничение количества
orderBy также принимает типизированные ссылки на столбцы, поэтому невозможно сортировать по столбцу, которого нет в таблице.
import { desc } from "drizzle-orm";
await db.select().from(users).orderBy(desc(users.age)).limit(10);Как работает отклонение
Построитель обобщён по типу таблицы. Сигнатуры where и select принимают только значения типа Column<TTable>, поэтому компилятор структурно отклоняет всё остальное.
// Conceptual signature
declare function select<T>(
table: T,
cols: { [k: string]: ColumnOf<T> }
): Query;Вставки тоже типизированы
Значения для insert проверяются по модели вставки. Отсутствующие обязательные поля или значения неправильных типов становятся ошибками компиляции ещё до выполнения SQL.
await db.insert(users).values({
name: "Ada",
isAdmin: false,
// missing fields would error; extra unknown keys error too
});Чем это помогает
Большинство ошибок ORM возникает из-за переименованного или неправильно указанного столбца и обнаруживается только во время выполнения. Безопасный с точки зрения типов построитель превращает такие ошибки в красные подчёркивания в редакторе задолго до развёртывания.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли построение типобезопасных запросов.
Итоги
Типобезопасное построение запросов использует типизированные ссылки на столбцы вместо строк. Неизвестные столбцы, операнды неправильных типов и столбцы таблиц, отсутствующих в предложении FROM, становятся ошибками компиляции. Построитель обобщён по таблице, поэтому система типов структурно обеспечивает корректность.
Часто задаваемые вопросы
Урок «Типобезопасное построение запросов» бесплатный?
Да — полный текст урока «Типобезопасное построение запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Типобезопасное построение запросов»?
Создавайте запросы, отклоняющие недопустимые столбцы во время компиляции Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Типобезопасное построение запросов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Преобразование схемы в тип
- Типобезопасное построение запросов
- Вывод структуры результата запроса
- Связи и объединения с типами