0Pricing
TypeScript Academy · Урок

Типобезопасное построение запросов

Создавайте запросы, отклоняющие недопустимые столбцы во время компиляции

«Типобезопасное построение запросов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Преобразование схемы в тип
  2. Типобезопасное построение запросов
  3. Вывод структуры результата запроса
  4. Связи и объединения с типами
← Назад к TypeScript Academy