移行
続編の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());
});