📅  最后修改于: 2023-12-03 14:47:24.471000             🧑  作者: Mango
在 Sequelize 中使用播种机可以作为一个方便的方法来填充数据库的数据。我们可以使用多个播种机来填充不同的表,这样可以保证我们的数据库数据是一致的。然而,有时候我们只需要使用一个播种机来填充所有的表,这样可以让代码更具可读性,也更方便进行维护。
在本文中,我们将介绍如何使用 Sequelize 只运行一个播种机来填充所有的表。
使用一个播种机的好处是可以将所有的数据填充逻辑都放在一个地方,这样可以方便地进行维护和查看。另外,单一的播种机可以降低代码的复杂度,因为我们不再需要管理多个播种机的启动顺序和加载顺序。
我们可以通过在 ./seeders
目录下创建一个单一的播种机来实现这个目标。假设我们有一个名为 data.js
的播种机,在这个机器里我们需要填充所有的数据。
以下是一个示例 data.js
中的代码:
const { User, Post } = require('../models');
const users = [
{ username: 'user1', email: 'user1@example.com' },
{ username: 'user2', email: 'user2@example.com' },
{ username: 'user3', email: 'user3@example.com' },
];
const posts = [
{ title: 'post1', content: 'post1 content' },
{ title: 'post2', content: 'post2 content' },
{ title: 'post3', content: 'post3 content' },
];
module.exports = {
up: async (queryInterface, Sequelize) => {
const transaction = await queryInterface.sequelize.transaction();
try {
const createdUsers = await User.bulkCreate(users, { transaction });
const createdPosts = await Post.bulkCreate(posts, { transaction });
await Promise.all(
createdPosts.map(post =>
post.setUser(
createdUsers[Math.floor(Math.random() * createdUsers.length)],
{ transaction }
)
)
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete({ model: User, where: {} });
await queryInterface.bulkDelete({ model: Post, where: {} });
},
};
在这个播种机中,我们首先导入了 User
和 Post
两个模型。接着,我们定义了要填充的数据,包括用户和帖子。在 up
方法中,我们执行了填充数据的代码。这里我们使用了 bulkCreate
方法来同时插入多个记录,然后使用 setUser
方法来设置帖子与用户的关联关系。最后,我们使用事务来保证插入和关联的一致性,以及出现错误时的回退能力。在 down
方法中,我们删除了所有已经插入的记录。
我们可以使用 Sequelize 的 CLI 工具来运行这个播种机。首先,我们需要通过以下命令来创建播种机的表:
$ npx sequelize-cli db:seed:all --debug
接着,我们可以通过以下命令来运行播种机:
$ npx sequelize-cli db:seed:run --debug --seeders-path ./seeders/
在这个命令中,--seeders-path
参数指明了播种机的位置。
在本文中,我们介绍了如何使用 Sequelize 只运行一个播种机来填充所有的表。我们创建了一个包含用户和帖子数据的播种机,并演示了如何运行这个播种机。这种方式可以让代码更加整洁和可读,同时也方便后续的维护和更新。