迁移
我建议你使用sequelize迁移 http://docs.sequelizejs.com/en/v3/docs/migrations/相反做sync()
在每个模型上。有一个模块 -续集.cli https://github.com/sequelize/cli这使您可以轻松管理迁移和种子。它以某种方式通过创建初始化文件来强制项目结构index.js
inside /models
项目的目录。它假设您的所有模型定义都位于此目录中。该脚本迭代所有模型文件(每个模型定义位于单独的文件中,例如mentee.js
, question.js
)并执行sequelize.import()
为了将这些模型分配给sequelize实例 - 这可以让您稍后通过以下方式访问它们sequelize[modelName]
e.g. sequelize.question
.
Note:创建迁移文件时请记住时间戳字段 -createdAt
, updatedAt
并且,最终,deletedAt
.
Sync
我个人使用sync()
仅当我运行测试时 - 这可能会分三个步骤显示
- perform
sequelize.sync({ force: true })
为了同步所有模型
- 运行一些数据库
seeds
(也可以通过sequelize-cli
),
- 运行测试。
这非常方便,因为允许您在运行测试之前清理数据库,并且为了区分开发和测试,测试可以使用不同的数据库,例如project_test
,使开发数据库保持完整。
多对多
现在让我们继续讨论您的问题 - 两个模型之间的 m:n 关系。首先,由于你执行的事实Promise.all()
, the sync
可以按照与在其中添加函数不同的顺序运行。为了避免这种情况,我建议您使用mapSeries
的特征Bluebird
Promise,Sequelize 在下面使用和公开sequelize.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 数组,但是第二个是一个函数,它使用每个先前定义的 Promise 的结果运行。由于这个事实Model.sync()
模型本身的结果,我们可以执行model.destroy()
在每次迭代时。
之后,您可以通过以下方式将一些数据插入数据库create()
,就像示例中一样。现在是时候修复了错误:受训者与受训者问题没有关联!错误。发生这种情况是因为您关联了Mentee
with Question
但之间没有关联MenteeQuestion
and Mentee
(or 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());
});