Миграции баз данных в TypeScript: полное руководство по инструментам и подходам

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Миграции баз данных в 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                    

Рекомендаций