Try   HackMD

TypeORM Migrations

Steps for Dev

1. Install typeorm globally

sudo npm install -g typeorm

2. Make ormconfig.js file and put it in project root.

module.exports = {  
  "type": "type",  // postgres, mysql
  "host": "localhost",  
  "port": 5432,  
  "username": "username",  
  "password": "password",  
  "database": "test",  
  "dropSchema" : false,  
  "entities": ["./src/domain/**/*.ts"],  // path to domain classes
  "migrationsTableName": "migrations",  
  "migrations": ["./src/migrations/**/*.ts"],  // path to migrations directory
  "cli": {  
    "migrationsDir": "./src/migrations"  
  }  
}

3. Make changes to domain classes

example: adding a column to a pre existing class


// important check for @Entity , @Column attributes at start of entity
import {Column, Entity} from "typeorm"; 
@Entity('x')
export class X{
	// pre existing code
	...
	...
	...
	// add new column
	@Column({nullable: true, array: true, type: String})  
	newColumnName: string[];
}

4. Generate a migration with a name

On console

npx ts-node ./node_modules/.bin/typeorm migration:generate -n AddNewColumnToX

5. Check for migration in migration folder

you should see this code
instance for a postgres db

import {MigrationInterface, QueryRunner} from "typeorm";  
  
export class AddNewColumnToX1534491159669 implements MigrationInterface {  
  
    public async up(queryRunner: QueryRunner): Promise<any> {  
        await queryRunner.query(`ALTER TABLE "X" ADD "newColumnName" character varying array`);  
    }  
  
    public async down(queryRunner: QueryRunner): Promise<any> {  
        await queryRunner.query(`ALTER TABLE "X" DROP COLUMN "newColumnName"`);  
    }  
  
}

6. Run Migrations

on console

npx ts-node ./node_modules/.bin/typeorm migration:run

on first migration , this should result

query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = current_schema() AND "table_name" = 'migrations'
query: CREATE TABLE "migrations" ("id" SERIAL NOT NULL, "timestamp" bigint NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_8c82d7f526340ab734260ea46be" PRIMARY KEY ("id"))
query: SELECT * FROM "migrations" "migrations"
0 migrations are already loaded in the database.
1 migrations were found in the source code.
1 migrations are new migrations that needs to be executed.
query: START TRANSACTION
query: ALTER TABLE "X" ADD "newColumnName" character varying array
query: INSERT INTO "migrations"("timestamp", "name") VALUES ($1, $2) -- PARAMETERS: [1534491159669,"AddNewColumnToX1534491159669"]
Migration AddNewColumnToX1534491159669 has been executed successfully.
query: COMMIT

Steps where there is no ts-node

1. Have js files generated in dev

  • check if 'migrations' directory exists in 'dist' directory
  • check for required migration files.
  • if required files do not exist, get them generated using while build using run tsc

2. Use Js path in ormconfig.js

 module.exports = {
    "type": "type",
    "host": config.get('db.host'),
    "port": 5432,
    "username": config.get('db.user'),
    "password": config.get('db.password'),
    "database": config.get('db.db'),
    "dropSchema": config.get('db.dropSchema'),
    "entities": ["./dist/domain/**/*.js"],
    "migrationsTableName": "migrations",
    "migrations": ["./dist/migrations/**/*.js"],
    "cli": {
      "migrationsDir": "./dist/migrations"
    }
  }

** check for migration folder in dist folder and generated js files for migrations, only proceed if required migration files exist in dist folder **

3. Run Migration

typeorm migration:run