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); } ... }