【发布时间】:2018-05-28 21:24:30
【问题描述】:
我正试图深入了解 Sequelize 的迁移以及它们如何与种子(或者一般的迁移和种子)一起工作。
我设置了一切以使迁移正常工作。
首先,让我们创建一个users 表:
// migrations/01-create-users.js
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable("Users", {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
email: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
},
updatedAt: {
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable("Users");
}
};
很好。如果我想播种(管理员)用户,我可以这样做:
// seeders/01-demo-user.js
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.bulkInsert(
"Users",
[
{
email: "demo@demo.com"
}
],
{}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete("Users", null, {});
}
};
然后为了让魔法发生,我会这样做:
$ sequelize db:migrate
这会在数据库中创建users 表。运行迁移后,下一步是播种,因此:
$ sequelize db:seed:all
Tataa,现在我在 users 数据库中有一个用户。太好了。
但现在我想将firstname 添加到users 表中,所以我必须添加另一个迁移:
// migrations/02-alter-users.js
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn("Users", "firstname", {
type: Sequelize.STRING
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn("Users", "firstname");
}
};
再次运行迁移只会运行第二个迁移,因为它保存在第一个已执行的数据库中。但默认情况下,sequelize 会重新运行所有播种机。那么我应该调整seeders/01-demo-user.js 还是更改默认行为并将播种机存储在数据库中并创建一个仅更新firstname 的新播种机?
如果firstname 不能是null,那么先运行迁移然后旧版本的seeders/01-demo-user.js 会抛出错误,因为firstname 不能是null。
重新运行播种器会导致另一个问题:已经有一个用户使用demo@demo.com 电子邮件。第二次运行它会复制用户。还是我必须在播种机中检查类似的东西?
以前,我只是在迁移中添加了用户帐户,因此我可以确定何时将其添加到数据库以及何时必须更新它。但是有人告诉我我做错了,我必须使用播种机来完成这样的任务。
非常感谢任何帮助/见解。
【问题讨论】:
-
你能解决这个问题吗?我也有同样的问题。
-
并非如此。现在,如果我正在使用播种机,我也将它们存储在运行它们的数据库中,这样它们就不会再次运行。
标签: node.js database sequelize.js database-migration