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モデルでこれらの制約を保持する必要がある場合。

試してみる — SQL to Sequelize Model

フルツールを開く