Индекс в миграции в Nest
На боевом сервере схему не меняют перезапуском с автосинхронизацией: нужен журнал шагов и возможность откатить правку. Индекс тогда создают в миграции, а не декоратором на сущности при старте.
Прямой метод миграции вызывает
createIndex с именем таблицы
и объектом TableIndex:
указывают имя индекса и список
колонок. Обратный метод снимает
индекс через dropIndex
по тому же имени. И в приложении,
и в источнике данных для CLI
synchronize держат
выключенным, чтобы таблицы
меняли только команды миграций.
Покажем на примере постов:
import { MigrationInterface, QueryRunner, TableIndex } from 'typeorm';
export class AddPostTitleIndex1730000002000 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createIndex(
'post',
new TableIndex({
name: 'IDX_post_title',
columnNames: ['title'],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropIndex('post', 'IDX_post_title');
}
}
Корень подключает базу без автосинхронизации схемы:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PostsModule } from './posts/posts.module.js';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'site',
autoLoadEntities: true,
synchronize: false,
}),
PostsModule,
],
})
export class AppModule {}
Источник данных для CLI повторяет то же правило и указывает каталог шагов:
import { DataSource } from 'typeorm';
export default new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'site',
synchronize: false,
entities: ['dist/**/*.entity.js'],
migrations: ['dist/migrations/*.js'],
});
После сборки проекта выполняют накопившиеся шаги:
npx typeorm migration:run -d dist/data-source.js
Опишите индекс по текстовому
полю в AddWorkerTitleIndex
через шаг схемы, выключите
автосинхронизацию в приложении
и источнике данных и выполните
накопившиеся шаги для проекта
работников.