私のアプリは現在Sequelize sync()
メソッドを使用してデータベースを作成しており、移行システムを使用するように変更したいと考えています。
私のモデルの1つに他のモデルとのbelongsTo()
関連付けがあり、これらの関連付けの初期移行コードを作成する方法がわかりません。
SQLクエリを使用して外部キーを手動で作成する必要がありますか、それともいくつかの方法がありますか?
ケース1:データベースの初期化
データベース構造の初期化中にリレーションを追加することが目的の場合は、マイグレーションを使用して手動で追加するのではなく、sync
メソッドを使用することをお勧めします。モデルが適切に設計され、関係が定義されている場合、sync
メソッドの実行中にモデルが自動的に作成されます。
sequelize express example を見てください。 modelsディレクトリには3つのファイルがあります。
index.js
-すべてのモデルを含みますtask.js
-タスクモデルuser.js
-ユーザーモデル見る task.js
コンテンツ、7行目から始めて、次のコードはユーザーモデルとタスクモデル間の関係を作成します。
classMethods: {
associate: function(models) {
Task.belongsTo(models.User, {
onDelete: "CASCADE",
foreignKey: {
allowNull: false
}
});
}
}
モデルファイルでリレーションを正しく準備すると、同期によって外部キーが作成されます。この場合、移行は必要ありません。
Express-example全体を読むことをお勧めしますreadme.md
とリポジトリファイルを参照して、ExpressおよびSequelizeでの動作を確認します。
ケース2:データベース構造の移行
保持したいデータがすでにある場合は、移行スクリプトを使用する必要があります。同期を行ってデータベースを再構築する唯一の方法は、すべてのデータとともに完全に破壊することです。
基本的な マイグレーションの続編ドキュメント について読むことができます。残念ながら、ドキュメントには関係の作成は含まれていません。次のリレーションを作成するとします。ユーザーはグループに属しています。リレーションのユーザー側に列を作成するには、addColumn
メソッドを使用できます。
queryInterface.addColumn(
'user',
'group_id',
{
type: Sequelize.INTEGER,
allowNull: true
}
)
残念ながら、(まだ)外部キー制約を作成するためのNice関数はありませんが、sequelizeクエリメソッドを使用して手動で行うことができます。 Postgresqlの例:
queryInterface.sequelize.query("ALTER TABLE user
ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
REFERENCES group (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;");
編集:データベース構造の移行ケースを追加
これを、上記の@ aryeh-armon回答に対するコメント(十分な担当者ではない)ではなく回答として追加します。モデル名ではなく、存在を確認するために必要なテーブル名です。つまり、モデルの名前がJobで、dbテーブルの名前がJobsの場合、移行は次のようになります。
jobId: {
type: Sequelize.INTEGER,
references: {
model: "Jobs",
key: "id"
}
},
移行への参照を追加できます
例:
user_id: {
type: Sequelize.BIGINT,
references: {
model: "users",
key: "id"
}
},
参照しているモデルが存在することを確認してください。