Как подготовить к работе БД PosgreSQL + TypeORM при первом деплое на продакшен-подобную среду?
B официальной документации NestJS рассмотрена конфигурация БД для режима локальной разработки:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql', // для PosgreSQL настройки аналочные
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [],
synchronize: true,
}),
],
})
export class AppModule {}
при этом сказано, что на продакшене устанавливать synchronize значение true небезопасно.
Хорошо, а что делать-то? Если просто оставить это значение в положении false, то при попытке обращения к базе данных произойдёт ошибка:
ERROR [ExceptionsHandler] relation "XXX" does not exist
Короткий ответ на вопрос я знаю: "миграции". Но тут есть некоторые детали, без знания которых это волшебное слово сдвига с мёртвой точки не даст.
Во-первых: означает ли это, что нужно в приведённой выше конфигурации прописывать условную конструкцию, согласно которой запускать миграцию нужно на всех режимах кроме локальной разработки?
@Module({
imports: [
TypeOrmModule.forRoot({
// ...
synchronize: __IS_LOCAL_DEVELOPMENT_MODE__,
migrations: [
...__IS_LOCAL_DEVELOPMENT_MODE__ ? [] : [ CreateDataBaseMigration ]
]
}),
],
})
export class AppModule {}
Если да, то я так чувствую, что по мере добавления новых миграцией все эти условия будут становиться всё сложнее и сложнее.
Второе: если нам всё равно придётся создавать базу данных с помощью миграции, то зачем нам synchronize: true? Что отложить написание этой миграции на потом?
Ответы (1 шт):
Да, в режиме продакшена не рекомендуется использовать опцию synchronize: true, так как это может привести к потере данных. Вместо этого рекомендуется использовать миграции базы данных.
Вы можете использовать условную конструкцию, как вы предложили, чтобы запускать миграции только в режиме продакшена. В приведенном примере, если переменная __IS_LOCAL_DEVELOPMENT_MODE__ равна true, то миграции не будут запущены, в противном случае будут запущены.
Но рекомендуется использовать какой-то инструмент для миграций, например TypeORM migrations, или любой другой, который поддерживает вашу БД. Это позволит вам легко отслеживать изменения в базе данных и откатывать их, если необходимо.