Programming Journal

学習したことの整理用です。

typeORM カラムの追加時の並び順を調整する

OverView

  • descriptionカラムを追加したい。
  • created_at, updated_atの前に追加したい

MySQL使用

import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm'

@Entity()
export class Users{

  @PrimaryGeneratedColumn('increment')
  readonly id!: number

  @Column({ name: 'name' })
  readonly name!: string

// Add
  @Column({ name: 'description' })
  readonly name!: string

  @CreateDateColumn({ name: 'created_at' })
  readonly createdAt!: Date

  @UpdateDateColumn({ name: 'updated_at' })
  readonly updatedAt!: Date

}

Problem

Entitiyの順番になると思ったら、追加したdescriptionカラムがupdated_atの後ろ、最後尾に位置してしまった
typeORMにカラムの順番を指定するオプションはなさそう

公式関連issue
https://github.com/typeorm/typeorm/issues/7687

https://github.com/typeorm/typeorm/issues/541

How to solve

調べても対処法が見つからなかったのでmigrationファイルを直接編集したらできた👏

  1. 通常とおりmigrationファイルを生成する。
    npm run typeorm migration:generate -- -n AddDescriptionColumnToUser

  2. 生成されたmigrationを編集
    AFTER [カラム名]を追加

  3. npm run typeorm migration:run

import { MigrationInterface, QueryRunner } from 'typeorm'

export class AddDescriptionColumnToUser1234567
  implements MigrationInterface {
  name = 'AddDescriptionColumnToUse1234567r'

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(          // AFTER [カラム名] を追加
      'ALTER TABLE `users` ADD `description` varchar(255) NOT NULL AFTER `name`',
    )
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query('ALTER TABLE `uers` DROP COLUMN `description`')
  }
}