Sequelizeで作成したテーブル名が複数形になる時の対処法
JavascriptでDB操作を使う際は、Sequelizeライブラリーを使うことが多いと思います。このライブラリーを使うことで
- データベース接続
- テーブル定義
- テーブル作成
- データ取得
などを簡単に行うことができます。
そんなSequelizeでテーブルを作成しようとするとモデルで定義したものとは異なり複数形でテーブル名が作成されます。company
でモデル定義すればcompanies
で作成されてしまうのです。
なので今回はテーブル名が複数形になる変更を修正する方法を解説していきます。
Sequelizeで作成したテーブル名は複数形になる
まずは、作成されたテーブルが複数形になるのかを確かめてみましょう。モデル定義にはcompany
という名前で定義して会社テーブルを作ってみます。
//会社テーブルの定義
const company = connect.define("company", {
company_id: {
type: Sequelize.INTEGER,
primaryKey:true,
comment: "会社ID"
},
company_name: {
type: Sequelize.STRING(50),
comment: "会社名",
}
})
//データベースと同期化
company.sync()
この状態でプログラムを動かして、データベースを確認するとcomanies
というテーブルが作成されているはずです。
実際に複数形になることが確認できました。このようにSequelizeは自動的に複数形になるようにテーブル名を書き換えます。また、単純な~s
の形式でなくてもperson
のような変則的なものでもpeople
に変換されるみたいです。
このような変換は、モデルは抽象的な考えであるのに対して、テーブルは具体的でデータも複数ある前提であるのが理由だと考えられます。
これを修正する方法は2種類あるのでそれぞれ紹介します。
- モデル名と同じテーブル名に強制する
- テーブル名を直接定義する
1.モデル名と同じテーブル名に強制する
1つ目の方法がモデル名として定義した名前をテーブル名として利用する方法です。defineメソッド
の最後にfreezeTableName:true
を追加します。
テーブルをドロップして、以下のソースを実行するとcompanyテーブルができているはずです。
//会社テーブルの定義
const company = connect.define("company", {
company_id: {
type: Sequelize.INTEGER,
primaryKey:true,
comment: "会社ID"
},
company_name: {
type: Sequelize.STRING(50),
comment: "会社名",
}
}, {
freezeTableName:true //テーブル名をモデルと同じにする
})
//データベースと同期化
company.sync()
このようにfreezeTableNameオプションを使えばモデルとテーブル名を同じにすることができます。
2.テーブル名を直接定義する
2つ目の方法がテーブル名を直接記述する方法です。tableNameオプションを使って定義します。
//会社テーブルの定義
const company = connect.define("company", {
company_id: {
type: Sequelize.INTEGER,
primaryKey:true,
comment: "会社ID"
},
company_name: {
type: Sequelize.STRING(50),
comment: "会社名",
}
}, {
tableName:"company" //テーブル名を直接定義する
})
//データベースと同期化
company.sync()
また、tableName
オプションを使えばcompany
という単数形だけでなく、corporation
のような別名に変更することもできます。
まとめ
- Sequelizeで定義したモデルはテーブル名に複数形で登録される
- 単数形に戻すにはfreezeTableNameオプションを使う
- tableNameオプションを使えば単数形にも、別名にも変更できる
Discussion