РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsPmRnFK 168 of 168 menu
◀

Внешний ключ в миграции в 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 с прямым и обратным методом, оставьте автосинхронизацию выключенной в корне.

←
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить