DEV Community

amir fakoor
amir fakoor

Posted on

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.

Top comments (9)

Collapse
 
polarisiota profile image
Polarisiota

Thanks~!

Collapse
 
cyimanafaisal profile image
CYIMANA Faisal

Thanks for this it worked 🙏🏽

Collapse
 
smurawczik profile image
Sebastian Murawczik

thanks for this, was really helpful

Collapse
 
felix_28fd916a3 profile image
Felix

Thank you, helped a lot!

Collapse
 
devwander profile image
Wanderson José

Thanks for the content, it helped me a lot!

Collapse
 
tongocduy1601 profile image
Tô Ngọc Duy • Edited

Hi Sir, when do follow your instructment, the migration file is generated at root folder,
I added those lines to customize migration folder, but not working,
how i do that
cli: {
migrationsDir: './src/database/migrations',
},

Collapse
 
greenflag31 profile image
Green

Article should be reworked. Stuff is presented without explanation, the most important is to UNDERSTAND what you are doing, and no beeing a 'copy pasta' developer.
What does your config service contains ?
Why do you load your entities manually and then add 'autoLoad: true' ? You give the impression you don't understand what you are doing.

Collapse
 
coderkk1992_36 profile image
Kalith Kumasaru

you must be a delight to work with

Collapse
 
carlosalbertor profile image
Carlos Alberto R.

Thanks for this. Well done!