sequelizeというnode.jsのORMを使う際に、webpackのproductionモードでビルドを行うと、コードがminifyされて、モデルのクラス名が変更されてしまい、literalで直書きのSQLでエラーが発生するということがありました。
あまり一般的な事象ではないようなので、TypeScript固有の問題かもしれません。
下記リンク先の記事で同じ問題に対処しています。
試行錯誤な日々: webpackのproductionモードでも動くSequelizeの直書きSQLを書く方法
しかし、私の場合、記事で紹介されている解決策である「literalで直書きしてあるSQL中のテーブル名を${User.name}のように取得する」というやり方では、多対多結合におけるthroughテーブル名の指定の仕方が分からず、うまくいきませんでした。
結果的にはモデルの定義のときにtableNameとmodelNameを両方指定することで解決しました。
例:
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しか指定していなかったため、見事にハマりました。
なお、tableNameはDBに実際に作られるテーブルの名称、modelNameはsequelizeにおけるモデルの名称という違いがあります。
デフォルトではtableNameは複数形 (e.g. Users)、modelNameは単数形 (e.g. User)です。