移行
続編のsync()
を実行します 各モデルで。モジュールがあります-index.js
を作成してプロジェクト構造を強制します。 /models
内 プロジェクトのディレクトリ。すべてのモデル定義がこのディレクトリにあることを前提としています。このスクリプトは、すべてのモデルファイルを繰り返し処理します(各モデル定義は、mentee.js
などの個別のファイルにあります。 、question.js
)そしてsequelize.import()
を実行します これらのモデルをsequelizeインスタンスに割り当てるために、これにより、後でsequelize[modelName]
を介してモデルにアクセスできます。 例えばsequelize.question
。
注: 移行ファイルを作成するときは、タイムスタンプフィールドについて覚えておいてください-createdAt
、updatedAt
そして、最終的には、deletedAt
。
同期
個人的にはsync()
を使用しています テストを実行した場合のみ-これは3つのステップで表示される場合があります
-
sequelize.sync({ force: true })
を実行します すべてのモデルを同期するために - データベースの
seeds
を実行します (sequelize-cli
からも実行できます )、 - テストを実行します。
テストを実行する前にデータベースをクリーンアップできるため、これは非常に快適です。開発とテストを区別するために、テストでは異なるデータベースを使用できます。 project_test
、開発データベースがそのまま残るようにします。
多対多
次に、問題に移りましょう-2つのモデル間のm:n関係。まず、Promise.all()
を実行するためです。 、sync
関数を追加するのとは異なる順序で実行できます。この状況を回避するには、mapSeries
を使用することをお勧めします Bluebird
の機能 Sequelizeが使用し、sequelize.Promise
で公開するpromise (これは、親行の削除に関する最後のエラーの理由でもあります-mentees
を削除しようとしています これはmenteequestion
から参照されます 。
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
mapSeries
の最初のパラメーター はpromiseの配列ですが、2番目の関数は、以前に定義された各promiseの結果を使用して実行される関数です。 Model.sync()
という事実のため 結果はモデル自体になり、model.destroy()
を実行できます 各反復で。
その後、create()
を使用してデータベースにデータを挿入できます。 、例のように。ここで、エラー:メンティーがメンティー質問に関連付けられていません!を修正します。 エラー。 Mentee
を関連付けているために発生します Question
ただし、MenteeQuestion
の間に関連付けはありません およびMentee
(またはQuestion
)。これを修正するには、belongsToMany
の後に 、追加できます
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
これで、include: [Mentee, Question]
を追加できるようになりました MenteeQuestion
をクエリするとき 。 toJSON()
を実行しているときに、別のエラーが発生することもあります 、findAll
を実行するため インスタンスの配列を返します。 forEach()
を実行できます
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});