Sequelize:种子与协会

zet*_*ett 8 javascript models seeding node.js sequelize.js

例如,我有2个模型,课程和视频.课程有很多视频.

// course.js
'use strict';

module.exports = (sequelize, DataTypes) => {
  const Course = sequelize.define('Course', {
    title: DataTypes.STRING,
    description: DataTypes.STRING
  });

  Course.associate = models => {
    Course.hasMany(models.Video);
  };

  return Course;
};


// video.js
'use strict';

module.exports = (sequelize, DataTypes) => {
  const Video = sequelize.define('Video', {
    title: DataTypes.STRING,
    description: DataTypes.STRING,
    videoId: DataTypes.STRING
  });

  Video.associate = models => {
    Video.belongsTo(models.Course, {
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    })
  };

  return Video;
};
Run Code Online (Sandbox Code Playgroud)

我想用包含视频的课程创建种子.我该怎么做?我不知道如何用包含的视频创建种子.

mcr*_*n18 16

您可以使用Sequelize queryInterface来下拉到原始SQL以插入需要关联的模型实例.在您的情况下,最简单的方法是为课程和视频创建一个播种机.(注意:我不知道你是如何定义你的主键和外键所以我假设视频表有一个字段course_id.)

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.bulkInsert('courses', [
      {title: 'Course 1', description: 'description 1', id: 1}
      {title: 'Course 2', description: 'description 2', id: 2}
    ], {});

    const courses = await queryInterface.sequelize.query(
      `SELECT id from COURSES;`
    );

    const courseRows = courses[0];

    return await queryInterface.bulkInsert('videos', [
      {title: 'Movie 1', description: '...', id: '1', course_id: courseRows[0].id}
      {title: 'Movie 2', description: '...', id: '2', course_id: courseRows[0].id},
      {title: 'Movie 3', description: '...', id: '3', course_id: courseRows[0].id},
    ], {});
  },

  down: async (queryInterface) => {
    await queryInterface.bulkDelete('videos', null, {});
    await queryInterface.bulkDelete('courses', null, {});
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 在“向下”部分,由于外键约束,我们不应该删除课程列之前的视频列。不过很抱歉很挑剔。 (2认同)

小智 9

当传入{ returning: true }其选项字段时bulkInsert,它将返回创建的对象。

    let createdOjects = await queryInterface.bulkInsert("table_name", data_to_be_inserted, { returning: true });
Run Code Online (Sandbox Code Playgroud)

另外,您可以传递一个包含您感兴趣的字段的数组,例如 ID { returning: ['id'] },这将返回所创建对象的 ID 数组

    let createdIds = await queryInterface.bulkInsert("table_name", data_to_be_inserted, { returning: ['id'] });
Run Code Online (Sandbox Code Playgroud)

您可以循环返回的对象/ID 并使用插入嵌套对象bulkInsert

示例代码:

module.exports = {
  up: async (queryInterface) => {
    let courses = ["..."]
    let videos = ["..."]
    let videoIds = await queryInterface.bulkInsert("courses", courses, { returning: ["id"] });
    
    //add courseId to each video object -- depends on your scheme

     await queryInterface.bulkInsert("videos", videos);
  },

  down: async (queryInterface) => {
    await queryInterface.bulkDelete("videos", null, {});
    await queryInterface.bulkDelete("courses", null, {});
  },
};
Run Code Online (Sandbox Code Playgroud)

  • 注意:“{returning: true }”选项[仅适用于 POSTGRES](https://sequelize.org/master/class/lib/model.js~Model.html#static-method-bulkCreate)。如果您使用不同的方言/数据库,它将被忽略 (8认同)