在 sequelize seeds 中查找记录
find records in sequelize seeds
我一直在尝试为我的项目写一些种子,但 运行 遇到了一些障碍。
我与 users
和 roles
table 有 many-to-many
关系。因此,当我为数据库播种时,我需要将具有正确 ID 的记录添加到我的连接 table 中。为此,我需要通过 email
查找用户,通过 name
查找角色并获取 ids
,这就是问题所在。我在 sequelize site. I'm using the sequelize-cli 上找不到关于播种和迁移内容的任何好的文档。我得到一个 queryInterface
作为参数,但我找不到任何示例或提及这个东西实际上可以做什么。只是一些简单的示例让我(以某种方式)完成了迁移以及我在 google.
上找到的内容
我已经通过 "dirty trick" 解决了这个问题...
// 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
查询数据库。我想知道你们中是否有人 运行 解决了这个问题,如果解决了,请分享。
这可能不是解决此问题的最佳做法,但我找不到更好的方法,但已经足够让我满意了。
基本上我所做的是需要所需表的实际模型并使用正常的 Sequelize API 来查找记录。
所以基本上,就是打拳
const { User } = require('./models');
up: function (queryInterface, Sequelize) {
return User.findOrCreate({
where: { email: 'john@doe.com' },
defaults: {
name: 'John Doe'
}
});
等等等等。
希望这对某人有所帮助,如果有人有更好的方法,请分享。
是的,您可以使用查询接口查询数据库。
async up(queryInterface, Sequelize) {
const user = await queryInterface.rawSelect('User', {
where: {
name: 'John doe',
},
}, ['id']);
if(!user) {
// do bulkInsert stuff.
}
},
我无法添加评论,尽管这是对已接受答案的编辑 。
将 plain: false
添加到 return 所有匹配条目的查询选项。 Sequelize 似乎没有 rawSelect
的文档。但是看看回购协议,它基本上是根据提供的参数构造一个原始查询。欲了解更多信息 https://sequelize.org/master/manual/raw-queries.html
所以它应该是这样的:
const users = await queryInterface.rawSelect(
'Users',
{
where: {
age: null,
},
plain: false,
},
['id'],
);
我一直在尝试为我的项目写一些种子,但 运行 遇到了一些障碍。
我与 users
和 roles
table 有 many-to-many
关系。因此,当我为数据库播种时,我需要将具有正确 ID 的记录添加到我的连接 table 中。为此,我需要通过 email
查找用户,通过 name
查找角色并获取 ids
,这就是问题所在。我在 sequelize site. I'm using the sequelize-cli 上找不到关于播种和迁移内容的任何好的文档。我得到一个 queryInterface
作为参数,但我找不到任何示例或提及这个东西实际上可以做什么。只是一些简单的示例让我(以某种方式)完成了迁移以及我在 google.
我已经通过 "dirty trick" 解决了这个问题...
// 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
查询数据库。我想知道你们中是否有人 运行 解决了这个问题,如果解决了,请分享。
这可能不是解决此问题的最佳做法,但我找不到更好的方法,但已经足够让我满意了。
基本上我所做的是需要所需表的实际模型并使用正常的 Sequelize API 来查找记录。
所以基本上,就是打拳
const { User } = require('./models');
up: function (queryInterface, Sequelize) {
return User.findOrCreate({
where: { email: 'john@doe.com' },
defaults: {
name: 'John Doe'
}
});
等等等等。 希望这对某人有所帮助,如果有人有更好的方法,请分享。
是的,您可以使用查询接口查询数据库。
async up(queryInterface, Sequelize) {
const user = await queryInterface.rawSelect('User', {
where: {
name: 'John doe',
},
}, ['id']);
if(!user) {
// do bulkInsert stuff.
}
},
我无法添加评论,尽管这是对已接受答案的编辑
将 plain: false
添加到 return 所有匹配条目的查询选项。 Sequelize 似乎没有 rawSelect
的文档。但是看看回购协议,它基本上是根据提供的参数构造一个原始查询。欲了解更多信息 https://sequelize.org/master/manual/raw-queries.html
所以它应该是这样的:
const users = await queryInterface.rawSelect(
'Users',
{
where: {
age: null,
},
plain: false,
},
['id'],
);