Демистификация автоинкрементных идентификаторов в TypeORM: подробное руководство

В современной веб-разработке работа с базами данных является важной частью создания приложений. TypeORM, популярная библиотека объектно-реляционного сопоставления (ORM) для TypeScript и Node.js, упрощает процесс взаимодействия с базами данных. Одним из распространенных требований при разработке таблиц базы данных является наличие поля идентификатора с автоматическим приращением, которое служит первичным ключом. В этой статье мы рассмотрим различные методы реализации автоматически увеличивающихся идентификаторов в TypeORM, сопровождаемые разговорными пояснениями и примерами кода.

Метод 1: использование декоратора PrimaryGeneratedColumn

Самый простой способ добиться автоматического увеличения идентификаторов в TypeORM — использовать декоратор PrimaryGeneratedColumn. Этот декоратор автоматически генерирует уникальный идентификатор для каждого нового экземпляра объекта. Вот пример:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
class User {
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  name: string;
}

В приведенном выше коде декоратор @PrimaryGeneratedColumn()расположен над свойством idобъекта User. TypeORM будет незаметно генерировать и увеличивать идентификаторы.

Метод 2: использование необработанного SQL при миграции

Если вы предпочитаете использовать необработанные SQL-запросы, вы можете добиться автоматического увеличения идентификаторов, написав миграции. Миграции — это сценарии, которые определяют изменения в структуре вашей базы данных. Вот пример сценария миграции, который добавляет столбец идентификатора с автоматическим приращением:

import {MigrationInterface, QueryRunner} from "typeorm";
export class AddAutoIncrementId1632885434204 implements MigrationInterface {
    async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`
            ALTER TABLE users
            ADD COLUMN id SERIAL PRIMARY KEY;
        `);
    }
    async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`
            ALTER TABLE users
            DROP COLUMN IF EXISTS id;
        `);
    }
}

В приведенном выше коде метод upдобавляет новый столбец с именем idв таблицу usersс SERIAL, который автоматически увеличивает значение для каждой новой строки.

Метод 3: использование синтаксиса, специфичного для базы данных

Различные базы данных имеют свой собственный синтаксис для определения автоматически увеличивающихся идентификаторов. TypeORM позволяет вам использовать эти функции, специфичные для базы данных. Например, в MySQL вы можете использовать ключевое слово AUTO_INCREMENT:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
class User {
  @PrimaryGeneratedColumn({ type: 'int', unsigned: true })
  id: number;
  @Column()
  name: string;
}

В приведенном выше коде декоратор @PrimaryGeneratedColumnизменен и включает дополнительные параметры, специфичные для MySQL, такие как параметры typeи unsigned.

Автоинкрементные идентификаторы являются фундаментальной частью проектирования базы данных, и TypeORM предоставляет несколько удобных методов их реализации. В этой статье мы рассмотрели три подхода: использование декоратора PrimaryGeneratedColumn, создание миграций с помощью необработанного SQL и использование синтаксиса, специфичного для базы данных. Понимая эти методы, вы сможете уверенно проектировать схемы баз данных в TypeORM и создавать надежные приложения.