Using TypeORM Migration in NestJS with Postgres Database
Tags: nestjs, typescript, typeorm, postgres
Published: 2023-05-03 16:45:42

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:

```bash
nest new my-app
```

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

```bash
npm install --save @nestjs/typeorm typeorm pg @nestjs/config
```

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.

```ts
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);
```

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

```ts
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 { }
```

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

```bash
DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_USERNAME=postgres
DATABASE_PASSWORD=dev-secret
DATABASE_NAME=postgres
```

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

```json
"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"
  },
```

To execute migration, use the following command:

```bash
npm run migration:run
```

To create a new migration, use the following command:

```bash
npm run migration:create --name=your_migration_name
```

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