📘

Sequelizeで作成したテーブル名が複数形になる時の対処法

2020/12/02に公開

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. モデル名と同じテーブル名に強制する
  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オプションを使えば単数形にも、別名にも変更できる

参考

Sequelize

Discussion