web-dev-qa-db-ja.com

Sequelizeマイグレーションの関連付け

私のアプリは現在Sequelize sync()メソッドを使用してデータベースを作成しており、移行システムを使用するように変更したいと考えています。

私のモデルの1つに他のモデルとのbelongsTo()関連付けがあり、これらの関連付けの初期移行コードを作成する方法がわかりません。

SQLクエリを使用して外部キーを手動で作成する必要がありますか、それともいくつかの方法がありますか?

18
loics2

ケース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;");

編集:データベース構造の移行ケースを追加

13
ezpn

これを、上記の@ aryeh-armon回答に対するコメント(十分な担当者ではない)ではなく回答として追加します。モデル名ではなく、存在を確認するために必要なテーブル名です。つまり、モデルの名前がJobで、dbテーブルの名前がJobsの場合、移行は次のようになります。

jobId: {
type: Sequelize.INTEGER,
references: {
    model: "Jobs",
    key: "id"
  }
},
8
adamS

何度も検索した後、自分のやりたいことを説明するブログ投稿をいくつか見つけました。

どうやらそれは実際に行う一般的な方法ではないようですが、私にとってはより論理的なようです。移行のみを使用する場合は、SQLクエリを使用して初期移行を作成する必要があります。

ここに投稿があります: 最初の投稿この投稿 からインスピレーションを得たものです。

しかし、とにかく、ezrepoteinは同期を使用して初期データベースを作成してから移行するのが正しいと思います。 umzugを使用するよりも簡単で、マイグレーションのみを使用します。

2
loics2

移行への参照を追加できます

例:

user_id: {
    type: Sequelize.BIGINT,
    references: {
        model: "users",
        key: "id"
    }
},

参照しているモデルが存在することを確認してください。

0
Aryeh Armon