SQL主キーとオートインクリメントをSequelizeに変換する

SQL PRIMARY KEY、SERIAL、AUTO_INCREMENT、IDENTITYカラムがSequelizeモデル定義でprimaryKeyとautoIncrementオプションにどのように変換されるかを解説します。

Associations

詳細な説明

Sequelizeでの主キーとオートインクリメント

主キーはすべてのデータベースモデルの基盤です。コンバーターは主キーとオートインクリメントカラムを定義するすべての一般的なSQLパターンを処理します。

SERIAL(PostgreSQL)

PostgreSQLのSERIALはシーケンス付きオートインクリメント整数の省略形です:

id SERIAL PRIMARY KEY
-- 変換後 -->
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false }

BIGSERIALは同じオプションでDataTypes.BIGINTにマッピングされます。

AUTO_INCREMENT(MySQL)

MySQLのAUTO_INCREMENTキーワードは直接autoIncrement: trueにマッピングされます:

id INT AUTO_INCREMENT PRIMARY KEY
-- 変換後 -->
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false }

IDENTITY(SQL Server)

SQL ServerはオートインクリメントカラムにIDENTITY(1,1)を使用します:

id INT IDENTITY(1,1) PRIMARY KEY
-- 変換後 -->
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false }

UUID主キー

UUIDベースの主キーの場合、SQL型はDataTypes.UUIDにマッピングされます:

id UUID PRIMARY KEY DEFAULT gen_random_uuid()
-- 変換後 -->
id: { type: DataTypes.UUID, primaryKey: true, defaultValue: DataTypes.UUIDV4, allowNull: false }

Sequelizeの動作

autoIncrement: trueが設定されている場合、Sequelizeは:

  1. INSERT文からカラムを省略(データベースに値の割り当てを委任)
  2. 挿入後に生成された値を読み戻す
  3. モデルインスタンスに自動的に設定

TypeScriptモードでは、オートインクリメントフィールドはレコード作成時に提供する必要がないため、CreationAttributes型でオプショナルとしてマークされます。

ユースケース

AUTO_INCREMENTカラムを持つMySQLデータベースをSERIALのPostgreSQLに移行しており、Sequelizeモデルは基盤となるデータベースに関係なく同じautoIncrement: trueオプションを使用するため、移行がシームレスになる場合。

試してみる — SQL to Sequelize Model

フルツールを開く