Sequelizeでwebpackのproduction時にテーブル名が変わって直書きSQLでエラーになる対策
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
)です。