TypeORMのCustomNamingStrategyでDBの命名規則を設定

TypeORMのCustomNamingStrategyでDBの命名規則を設定

Tags
Node.js
TypeORM
Database
Published
April 10, 2024
Last Updated
Last updated February 24, 2025
Author
TypeORMのデフォルト状態で生成されるPKやIndexの命名が気になるのでCustomNamingStrategyを作成して命名規則を統一する
 
この記事ではテーブル名・カラム名がスネークケースになるように設定する方法を紹介します。
 

デフォルトの状態

@Entity() export class UserProfile { @Column() public firstName: string; }
生成されるテーブル名: user_profiles
生成されるカラム名: firstName
 

明示的に指定してスネークケースにする

@Entity('user_profiles') export class UserProfile { @Column({ name: 'first_name' }) public firstName: string; }
 
生成されるテーブル名: user_profiles
生成されるカラム名: first_name
 

CustomNamingStragegyを設定すると指定が不要に!

import { DefaultNamingStrategy, Table } from 'typeorm'; import { snakeCase } from 'typeorm/util/StringUtils'; export class SnakeNamingStrategy extends DefaultNamingStrategy { primaryKeyName(tableOrName: Table | string, columnNames: string[]): string { const tableName = tableOrName instanceof Table ? tableOrName.name : tableOrName; return 'PK_' + tableName + '_' + columnNames.join('_'); } columnName( propertyName: string, customName: string, embeddedPrefixes: string[] ): string { const name = customName || propertyName; if (embeddedPrefixes.length) { return snakelCase(embeddedPrefixes.join('_')) + snakeCase(name); } return snakeCase(name); } uniqueConstraintName( tableOrName: Table | string, columnNames: string[] ): string { const tableName = tableOrName instanceof Table ? tableOrName.name : tableOrName; return 'UQ_' + tableName + '_' + columnNames.join('_'); } foreignKeyName(tableOrName: Table | string, columnNames: string[]): string { const tableName = tableOrName instanceof Table ? tableOrName.name : tableOrName; return 'FK_' + tableName + '_' + columnNames.join('_'); } relationConstraintName( tableOrName: string | Table, columnNames: string[] ): string { const tableName = tableOrName instanceof Table ? tableOrName.name : tableOrName; return 'REL_' + tableName + '_' + columnNames.join('_'); } indexName( tableOrName: Table | string, columnNames: string[] // where?: string ): string { const tableName = tableOrName instanceof Table ? tableOrName.name : tableOrName; return 'IDX_' + tableName + '_' + columnNames.join('_'); } }
 
typeormの設定ファイルで適用する
namingStrategy: new SnakeNamingStrategy()

おまけ

TypeORMでClosureTableなどを作成するときに@TreeParentなどのデコレーターを使用するとキャメルケースでカラムが自動生成される。このカラム名をparent_idのようなスネークケースに変更する方法
 
方法①
@TreeParent() @JoinColumn({ name: 'parent_id' }) // 明示的にカラム名を指定する parent: Category;
方法②
CustomNamingStrategyでスネークケースになるように指定する
import { DefaultNamingStrategy, Table } from 'typeorm'; import { camelCase, snakeCase } from 'typeorm/util/StringUtils'; export class CustomizeNamingStrategy extends DefaultNamingStrategy { columnName( propertyName: string, customName: string, embeddedPrefixes: string[] ): string { const name = customName || propertyName; if (embeddedPrefixes.length) { return camelCase(embeddedPrefixes.join('_')) + snakeCase(name); } return snakeCase(name); } ... }