我一直试图为我的项目写一些种子,但我遇到了一些障碍。
我与many-to-many
和users
表格有roles
关系。因此,当我播种数据库时,我需要将一个带有正确ID的记录添加到我的连接表中。为此,我需要按email
找到用户,name
找到角色,然后获取ids
,这就是问题所在。我无法在sequelize site找到任何好的文档。我使用sequelize-cli进行播种和迁移。我得到一个参数queryInterface
,但我找不到任何例子或提到这件事实际上可以做什么。只是一些简单的例子让我完成了迁移(不知何故)以及我能在谷歌上找到的东西。
我通过使用"肮脏的技巧解决了这个问题"我说...
// user_seeds.js
up: function (queryInterface, Sequelize) {
return queryInterface.bulkInsert(table, [{
id: 1,
name: 'John doe',
email: 'john@doe.com',
created_at,
updated_at
}], {});
// roles_seeds.js
up: function (queryInterface, Sequelize) {
return queryInterface.bulkInsert(table, [{
id: 1,
name: 'admin',
created_at,
updated_at
}, {
id: 2,
name: 'user',
created_at,
updated_at
}]);
//user_roles_seeds.js
up: function (queryInterface, Sequelize) {
return queryInterface.bulkInsert(table, [{
employee_id: 1,
role_id: 1
}]);
},
不喜欢这个解决方案,因为如果我想再次运行种子并忘记它是如何工作的,将来可能会很麻烦。应该有一种方法可以使用此queryInterface
查询数据库。我想知道你是否有人遇到过这个问题并解决了它,如果有的话,请分享。
答案 0 :(得分:8)
是的,您可以使用queryInterface查询数据库。
async up(queryInterface, Sequelize) {
const user = await queryInterface.rawSelect('User', {
where: {
name: 'John doe',
},
}, ['id']);
if(!user) {
// do bulkInsert stuff.
}
},
答案 1 :(得分:2)
这可能不是解决此问题的最佳做法,但我找不到更好的东西,这足以令我满意。
基本上我所做的是需要所需表格的实际模型,并使用普通的Sequelize API来查找记录。
所以基本上,只需打一下
const { User } = require('./models');
up: function (queryInterface, Sequelize) {
return User.findOrCreate({
where: { email: 'john@doe.com' },
defaults: {
name: 'John Doe'
}
});
依此类推。 希望这有助于某人,如果有人有更好的方法,请分享。
答案 2 :(得分:2)
我无法添加评论,尽管这是对已接受答案 here 的编辑。
将 plain: false
添加到查询选项以返回所有匹配的条目。 Sequelize 似乎没有 rawSelect
的文档。但是查看 repo,它基本上从提供的参数构建了一个原始查询。欲了解更多信息https://sequelize.org/master/manual/raw-queries.html
所以它应该是这样的:
const users = await queryInterface.rawSelect(
'Users',
{
where: {
age: null,
},
plain: false,
},
['id'],
);