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
Next, install the required packages for TypeORM, Postgres, and Configuration:
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.
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:
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:
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:
"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:
npm run migration:run
To create a new migration, use the following command:
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.
Top comments (15)
Wow! This article is a huge time saver for me.
Thank you so much for sharing your knowledge Amir
Thanks for this it worked 🙏🏽
Thanks~!
Good explanation!!!
Thanks man! Saved my day.
thanks for the great article
just note that the windows users must use
"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%",
for the scripts
thanks for this, was really helpful
Thank you, helped a lot!
Thanks for the content, it helped me a lot!
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.
you must be a delight to work with
I agree with you Mr.Green.