SQL ENUMをSequelize DataTypes.ENUMに変換する
事前定義された値を持つSQL ENUMカラム型が、モデル定義内で同じ値制約を持つSequelize DataTypes.ENUMにどのように変換されるかを学びます。
Data Types
詳細な説明
SequelizeでのENUM型
SQL ENUMカラムは値を事前定義されたセットに制限します。SequelizeはDataTypes.ENUMを提供し、ORMレベルで同じ制約を適用し、適切なデータベースレベルの制約を生成します。
基本的なENUM変換
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
status ENUM('pending', 'processing', 'shipped', 'delivered') NOT NULL DEFAULT 'pending',
priority ENUM('low', 'medium', 'high') DEFAULT 'medium'
);
Order.init({
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false },
status: {
type: DataTypes.ENUM('pending', 'processing', 'shipped', 'delivered'),
allowNull: false,
defaultValue: 'pending',
},
priority: {
type: DataTypes.ENUM('low', 'medium', 'high'),
allowNull: true,
defaultValue: 'medium',
},
}, { ... });
データベース互換性
DataTypes.ENUMの動作はデータベースによって異なります:
- MySQL: ネイティブENUMカラム型を作成
- PostgreSQL: 内部で
CREATE TYPEによりカスタム型を作成 - SQLite: CHECK制約を使用して許可値を強制
- SQL Server: CHECK制約を使用
TypeScript統合
TypeScriptモードを使用する場合、モデルと一緒にenumまたはユニオン型を定義します:
type OrderStatus = 'pending' | 'processing' | 'shipped' | 'delivered';
interface OrderAttributes {
id: number;
status: OrderStatus;
}
ENUMとStringの使い分け
ENUMは小さく固定された値セット(ステータスコード、ロール、優先度など)がある場合に最適です。値セットが頻繁に変更される場合は、DataTypes.STRINGとアプリケーションレベルのバリデーションの使用を検討してください。ENUM値の変更にはデータベースマイグレーションが必要になるためです。
ユースケース
注文ステータスと支払い方法カラムにMySQL ENUM型を使用するECサイトのデータベースを変換しており、データの整合性のためにSequelizeモデルでこれらの制約を保持する必要がある場合。