Миграции баз данных в TypeScript: как управлять схемой без боли
Разработка на TypeScript требует не только строгой типизации кода, но и надежного управления структурой базы данных. Миграции — это способ версионировать изменения схемы БД, позволяющий команде синхронизировать состояние базы с кодом приложения. В этой статье разберем основные библиотеки для миграций в TypeScript-проектах, их особенности и приведем практические примеры.
Что такое миграции и зачем они нужны?
Миграция — это файл с инструкциями, описывающими изменения схемы базы данных (создание, изменение или удаление таблиц, индексов, связей). Преимущества использования миграций:
- Версионирование — каждое изменение фиксируется в отдельном файле с меткой времени или номером.
- Воспроизводимость — можно развернуть базу с нуля на любой версии.
- Командная работа — все разработчики применяют одинаковые изменения.
- Откат — возможность отменить неудачные изменения.
Популярные инструменты для миграций в TypeScript
1. TypeORM
TypeORM — ORM, работающий с TypeScript и JavaScript. Встроенная система миграций основана на командной строке.
Установка:
npm install typeorm reflect-metadata
npm install @types/node --save-dev
Пример генерации миграции:
npx typeorm migration:create src/migration/AddUserTable
Пример кода миграции:
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export class AddUserTable1234567890123 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(new Table({
name: "users",
columns: [
{ name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },
{ name: "name", type: "varchar", length: "255" },
{ name: "email", type: "varchar", length: "255", isUnique: true }
]
}));
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable("users");
}
}
Запуск миграций:
npx typeorm migration:run
Преимущества: тесная интеграция с TypeORM, автоматическая генерация на основе сущностей.
Недостатки: при сложных проектах может быть медленным, требуется настройка конфигурации.
2. Prisma
Prisma — современный ORM с мощной системой миграций. Использует декларативный DSL (Prisma Schema Language).
Установка:
npm install prisma @prisma/client
npx prisma init
Пример схемы (schema.prisma):
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
authorId Int
author User @relation(fields: [authorId], references: [id])
}
Создание и применение миграции:
npx prisma migrate dev --name init
Prisma автоматически создает SQL-файл и применяет его к базе данных. Также можно просмотреть статус:
npx prisma migrate status
Преимущества: декларативный подход, автоматическая генерация, отличная документация.
Недостатки: привязан к Prisma, сложно обойти при особых сценариях.
3. Knex.js
Knex.js — легкий построитель запросов для Node.js, который включает систему миграций. Работает с TypeScript через дополнительные типы.
Установка:
npm install knex sqlite3
npm install @types/node --save-dev
Пример создания миграции:
npx knex migrate:make create_users_table
Пример кода миграции (TypeScript):
import { Knex } from "knex";
export async function up(knex: Knex): Promise<void> {
await knex.schema.createTable("users", (table) => {
table.increments("id").primary();
table.string("name", 255).notNullable();
table.string("email", 255).unique().notNullable();
table.timestamps(true, true);
});
}
export async function down(knex: Knex): Promise Также в библиотеке
Конфигурация приложений Swift (iOS/macOS): лучшие практики и инструменты
Firebase Android SDK для Kotlin: полное руководство с примерами
Stripe для JavaScript (Node.js): полное руководство с примерами
Тестирование в Java: фреймворки и инструменты (JUnit, TestNG, Mockito)