Внешний ключ в миграции в Nest
Пусть колонка с идентификатором автора уже есть в таблице материала, но база не мешает вставить число без строки в таблице людей. Схема доверяет коду, а не проверяет ссылку сама.
Жёсткое правило добавляют
шагом миграции: через
QueryRunner вызывают
createForeignKey и передают
объект TableForeignKey
с именем таблицы, колонкой
authorId и целевой
таблицей author по id.
Обратный метод снимает ключ
через dropForeignKey.
Покажем на примере постов:
import { MigrationInterface, QueryRunner, TableForeignKey } from 'typeorm';
export class AddPostAuthorForeignKey1730000002000 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createForeignKey(
'post',
new TableForeignKey({
columnNames: ['authorId'],
referencedTableName: 'author',
referencedColumnNames: ['id'],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
const table = await queryRunner.getTable('post');
const foreignKey = table.foreignKeys.find(
(key) => key.columnNames.indexOf('authorId') !== -1,
);
if (foreignKey) {
await queryRunner.dropForeignKey('post', foreignKey);
}
}
}
Сущности поста и автора регистрируют в модуле темы:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Author } from '../author.entity.js';
import { Post } from '../post.entity.js';
@Module({
imports: [TypeOrmModule.forFeature([Post, Author])],
})
export class PostsModule {}
Приложение и источник для CLI держат автосинхронизацию выключенной - таблицы и ключи только из миграций:
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'],
});
Добавьте внешний ключ
колонки отдела у Worker
на Department в AddWorkerDepartmentForeignKey
с прямым и обратным методом,
оставьте автосинхронизацию
выключенной в корне.