Using TypeORM Migration in NestJS with Postgres Database

amirfakour

amir fakoor

Posted on May 3, 2023

Using TypeORM Migration in NestJS with Postgres Database

If you are building a NestJS application and want to use a PostgreSQL database with TypeORM migration, then this article will guide you on creating and running migrations efficiently.

First, create a NestJS application with Nest CLI:

nest new my-app
Enter fullscreen mode Exit fullscreen mode

Next, install the required packages for TypeORM, Postgres, and Configuration:

npm install --save @nestjs/typeorm typeorm pg @nestjs/config
Enter fullscreen mode Exit fullscreen mode

Create a file to store the TypeORM configuration in the src/config/typeorm.ts directory. This file should export a TypeORM configuration object and a connection source object.

import { registerAs } from "@nestjs/config";
import { config as dotenvConfig } from 'dotenv';
import { DataSource, DataSourceOptions } from "typeorm";

dotenvConfig({ path: '.env' });

const config = {
    type: 'postgres',
    host: `${process.env.DATABASE_HOST}`,
    port: `${process.env.DATABASE_PORT}`,
    username: `${process.env.DATABASE_USERNAME}`,
    password: `${process.env.DATABASE_PASSWORD}`,
    database: `${process.env.DATABASE_NAME}`,
    entities: ["dist/**/*.entity{.ts,.js}"],
    migrations: ["dist/migrations/*{.ts,.js}"],
    autoLoadEntities: true,
    synchronize: false,
}

export default registerAs('typeorm', () => config)
export const connectionSource = new DataSource(config as DataSourceOptions);
Enter fullscreen mode Exit fullscreen mode

Load TypeORM into app.module.ts to use it in your NestJS application:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import typeorm from './config/typeorm';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [typeorm]
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => (configService.get('typeorm'))
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }
Enter fullscreen mode Exit fullscreen mode

Create a .env file in the src/ directory to define the variables in your typeorm.ts file:

DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_USERNAME=postgres
DATABASE_PASSWORD=dev-secret
DATABASE_NAME=postgres
Enter fullscreen mode Exit fullscreen mode

Add the TypeORM migration commands into your package.json file:

"scripts": {
    // ...
    "typeorm": "ts-node ./node_modules/typeorm/cli",
    "migration:run": "npm run typeorm migration:run -- -d ./src/config/typeorm.ts",
    "migration:generate": "npm run typeorm -- -d ./src/config/typeorm.ts migration:generate ./src/migrations/$npm_config_name",
    "migration:create": "npm run typeorm -- migration:create ./src/migrations/$npm_config_name",
    "migration:revert": "npm run typeorm -- -d ./src/config/typeorm.ts migration:revert"
  },
Enter fullscreen mode Exit fullscreen mode

To execute migration, use the following command:

npm run migration:run
Enter fullscreen mode Exit fullscreen mode

To create a new migration, use the following command:

npm run migration:create --name=your_migration_name
Enter fullscreen mode Exit fullscreen mode

That's it! With this guide, you should now be able to use TypeORM migration with Postgres in your NestJS application efficiently.

💖 💪 🙅 🚩
amirfakour
amir fakoor

Posted on May 3, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related