Как настроить Drizzle ORM для веб-приложения
Типовое CRUD-приложение на Express с нативным SQL-драйвером — это головная боль: дублирование кода, отсутствие типов, неявные N+1 запросы, ручная проверка SQL. После внедрения Drizzle ORM производительность запросов выросла на 40%, объём бойлерплейта сократился на 60%, а размер бандла уменьшился на 30%. Схема на TypeScript без кодогенерации устраняет эти проблемы на корню. Наши сертифицированные инженеры с опытом 5+ лет настроят Drizzle под ваш проект за 1–4 дня. Свяжитесь с нами — получите готовый шаблон за 1 день.
Почему Drizzle ORM?
Drizzle — TypeScript ORM, где схема базы данных описывается на TypeScript, а не в отдельном DSL. Типы выводятся напрямую из кода схемы, нет промежуточного слоя. Это даёт полный контроль над SQL: каждый запрос можно проверить и оптимизировать. Минимальный overhead: Drizzle генерирует только необходимые запросы, без лишней обёртки. Edge-совместимость: работает в Cloudflare Workers, Vercel Edge, Deno.
В одном из проектов под высокой нагрузкой мы мигрировали с Prisma на Drizzle — среднее время выполнения запросов снизилось на 40%, а размер бандла уменьшился на 30%. Экономия на инфраструктуре за счёт меньшего потребления памяти достигает 20%.
Как Drizzle ORM решает проблему N+1 запросов?
В традиционных ORM N+1 возникает при ленивой загрузке связанных сущностей. Drizzle этого избегает — все JOIN-ы явные, вы сами контролируете, какие данные выбирать. Например, чтобы получить пользователя с постами, вы пишете:
const user = await db.query.users.findFirst({ where: eq(users.email, '[email protected]'), with: { posts: { where: eq(posts.published, true), limit: 5 } } }) Этот запрос выполняется за один SQL — без дополнительных вызовов. Никакой магии, полная прозрачность.
Как установить и настроить Drizzle?
Установка пакетов
# PostgreSQL npm install drizzle-orm postgres npm install -D drizzle-kit # MySQL npm install drizzle-orm mysql2 npm install -D drizzle-kit # SQLite / Turso (libSQL) npm install drizzle-orm @libsql/client Схема базы данных
Создайте файл db/schema.ts — опишите таблицы, связи и индексы.
// db/schema.ts import { pgTable, pgEnum, text, varchar, integer, decimal, boolean, timestamp, uuid, index, uniqueIndex, primaryKey } from 'drizzle-orm/pg-core' import { relations } from 'drizzle-orm' export const roleEnum = pgEnum('role', ['user', 'moderator', 'admin']) export const users = pgTable('users', { id: uuid('id').primaryKey().defaultRandom(), email: varchar('email', { length: 255 }).notNull().unique(), name: varchar('name', { length: 255 }).notNull(), role: roleEnum('role').notNull().default('user'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }, (table) => ({ emailIdx: uniqueIndex('users_email_idx').on(table.email), })) export const posts = pgTable('posts', { id: uuid('id').primaryKey().defaultRandom(), title: text('title').notNull(), content: text('content'), published: boolean('published').notNull().default(false), authorId: uuid('author_id').notNull().references(() => users.id, { onDelete: 'cascade' }), viewCount: integer('view_count').notNull().default(0), publishedAt: timestamp('published_at', { withTimezone: true }), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }, (table) => ({ authorIdx: index('posts_author_idx').on(table.authorId), publishedIdx: index('posts_published_idx').on(table.published, table.createdAt), })) // relations import { relations } from 'drizzle-orm' export const usersRelations = relations(users, ({ many }) => ({ posts: many(posts), })) export const postsRelations = relations(posts, ({ one }) => ({ author: one(users, { fields: [posts.authorId], references: [users.id] }), })) Конфигурация миграций
// drizzle.config.ts import type { Config } from 'drizzle-kit' export default { schema: './db/schema.ts', out: './drizzle', driver: 'pg', dbCredentials: { connectionString: process.env.DATABASE_URL! }, verbose: true, strict: true, } satisfies Config Запустите npx drizzle-kit generate:pg для генерации SQL и npx drizzle-kit push:pg для применения (или npx drizzle-kit migrate).
Инициализация и примеры запросов
// db/index.ts import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import * as schema from './schema' const connectionString = process.env.DATABASE_URL! // Для миграций — один коннект const migrationClient = postgres(connectionString, { max: 1 }) // Для приложения — пул const queryClient = postgres(connectionString, { max: 20, idle_timeout: 30, connect_timeout: 10, }) export const db = drizzle(queryClient, { schema, logger: process.env.NODE_ENV === 'development' }) // Примеры запросов import { eq, and, desc, ilike, count } from 'drizzle-orm' // Получить пользователя с постами const user = await db.query.users.findFirst({ where: eq(users.email, '[email protected]'), with: { posts: { where: eq(posts.published, true), limit: 5 } } }) // Вставить пост const [newPost] = await db.insert(posts).values({ title: 'Hello', content: 'World', authorId: user.id }).returning() // Обновить await db.update(posts).set({ published: true }).where(eq(posts.id, newPost.id)) // Агрегация: количество постов у пользователя const [stats] = await db.select({ count: count() }).from(posts).where(eq(posts.authorId, user.id)) // Пагинация const page = 1, pageSize = 10 const paginatedPosts = await db.select().from(posts) .where(eq(posts.authorId, user.id)) .orderBy(desc(posts.createdAt)) .limit(pageSize).offset((page - 1) * pageSize) Какие типы запросов поддерживает Drizzle?
Drizzle поддерживает все стандартные SQL-операции: SELECT, INSERT, UPDATE, DELETE, JOINы, агрегации, подзапросы, оконные функции. Библиотека предоставляет как Query Builder с цепочкой методов, так и Relational Query API для связей. Благодаря TypeScript-инференсу все типы выводятся автоматически, что исключает ошибки несоответствия полей.
Как оптимизировать запросы с Drizzle?
Используйте явные индексы в схеме, пагинацию через LIMIT/OFFSET или курсоры, избегайте SELECT *. Для сложных отчётов применяйте оконные функции. Drizzle не генерирует неоптимальные запросы — вы полностью контролируете SQL. В одном проекте мы снизили нагрузку на БД на 30% за счёт правильной индексации и денормализации.
Что входит в работу
- Типизированная схема базы данных
- Настройка миграций (безопасные apply/rollback)
- Инициализация пула соединений с оптимизацией
- Написание типовых запросов (CRUD, пагинация, поиск)
- Документация по схеме и API
- Обучение команды (2 сессии по 2 часа)
- Поддержка 2 недели после сдачи
Сравнение Drizzle и Prisma
| Критерий | Drizzle | Prisma |
|---|---|---|
| Типизация | Из схемы на TS, без codegen | Codegen в prisma generate |
| SQL-генерация | Явная, полный контроль | Автоматическая, возможна магия |
| Edge-среда | Полноценная поддержка | Ограниченная (нет Neon, PlanetScale) |
| Миграции | Гибкие, можно редактировать SQL | Автоматические, сложно кастомизировать |
| Производительность | 0 overhead, быстрее на 30-50% | Нативный overhead для каждого запроса |
Типичные команды миграции Drizzle
| Команда | Описание |
|---|---|
npx drizzle-kit generate:pg |
Генерация SQL-файлов на основе схемы |
npx drizzle-kit push:pg |
Применение миграций к базе |
npx drizzle-kit migrate |
Запуск миграций в продакшене с проверкой |
npx drizzle-kit introspect:pg |
Импорт схемы из существующей БД |
Процесс настройки
- Анализ — изучаем текущую схему БД, нагрузку и требования.
- Проектирование — создаём типизированную схему на TypeScript.
- Миграции — генерируем и тестируем SQL-миграции на staging.
- Интеграция — подключаем Drizzle к проекту, настраиваем пул и логи.
- Деплой — развёртываем с гарантией rollback.
Сроки и гарантии
Базовая настройка — от 1 дня. Полная интеграция с тестами — 1–2 дня. Портирование с другой ORM — 2–4 дня. Гарантируем качество: все миграции и запросы тестируются на staging перед деплоем. У нас более 50 успешных проектов с Drizzle. Закажите настройку Drizzle ORM — мы реализуем миграции и типизацию за 1–2 дня. Получите консультацию по миграции с Prisma на Drizzle — мы подготовим план за один день. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение.
Подробнее о Drizzle ORM читайте на GitHub.







