Sequelizeでwebpackのproduction時にテーブル名が変わって直書きSQLでエラーになる対策

sequelizeというnode.jsのORMを使う際に、webpackのproductionモードでビルドを行うと、コードがminifyされて、モデルのクラス名が変更されてしまい、literalで直書きのSQLでエラーが発生するということがありました。

あまり一般的な事象ではないようなので、TypeScript固有の問題かもしれません。

下記リンク先の記事で同じ問題に対処しています。

試行錯誤な日々: webpackのproductionモードでも動くSequelizeの直書きSQLを書く方法

しかし、私の場合、記事で紹介されている解決策である「literalで直書きしてあるSQL中のテーブル名を${User.name}のように取得する」というやり方では、多対多結合におけるthroughテーブル名の指定の仕方が分からず、うまくいきませんでした。

結果的にはモデルの定義のときにtableNamemodelNameを両方指定することで解決しました。

例:

User.init(
  {
    id: {
      type: DataTypes.INTEGER.UNSIGNED,
      autoIncrement: true,
      primaryKey: true,
    },
    name: {
      type: new DataTypes.STRING(128),
      allowNull: false,
    },
  },
  {
    tableName: "Users",
    modelName: "User",
    sequelize,
  }
);

情報源

実は、このことは以下のページの「Minification」の項目に書いてありました。

GitHub - RobinBuschmann/sequelize-typescript: Decorators and some other features for sequelize

最初にコードを書く際には下記のsequelizeの公式ページを参照しましたが、こちらにはtableNameしか指定していなかったため、見事にハマりました。

Manual | Sequelize

なお、tableNameはDBに実際に作られるテーブルの名称、modelNameはsequelizeにおけるモデルの名称という違いがあります。

デフォルトではtableNameは複数形 (e.g. Users)、modelNameは単数形 (e.g. User)です。