首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用关联序列化大容量插入

使用关联序列化大容量插入
EN

Stack Overflow用户
提问于 2020-09-16 22:29:55
回答 2查看 2.3K关注 0票数 4

我正在尝试使用关联进行批量插入,我有一个'Song‘模型,它与迁移CLI定义的'Genre’和'Language‘有一对多的关系。歌曲:

代码语言:javascript
运行
复制
module.exports = (sequelize, DataTypes) => {
    class Song extends Model {
     
        static associate(models) {
            // define association here
            Song.hasMany(models["Language"])
            Song.hasMany(models["Genre"])
        }
    };
    Song.init({
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        name: DataTypes.STRING,
        energy: {type: DataTypes.FLOAT, allowNull: false},
        valence: {type: DataTypes.FLOAT, allowNull: false}
    }, {
        sequelize,
        modelName: 'Song',
        timestamps: true
    });
    return Song;
};

语言:

代码语言:javascript
运行
复制
module.exports = (sequelize, DataTypes) => {
    class Language extends Model {
        static associate(models) {
            // define association here
            models["Language"].belongsTo(models["Song"])
        }
    };
    Language.init({
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        name: DataTypes.STRING
    }, {
        sequelize,
        modelName: 'Language',
        indexes: [{unique: true, fields: ['name']}]
    });
    return Language;
};

类型:

代码语言:javascript
运行
复制
module.exports = (sequelize, DataTypes) => {
    class Genre extends Model {
        /**
         * Helper method for defining associations.
         * This method is not a part of Sequelize lifecycle.
         * The `models/index` file will call this method automatically.
         */
        static associate(models) {
            // define association here
            models["Genre"].belongsTo(models["Song"])
        }
    };
    Genre.init({
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        name: DataTypes.STRING
    }, {
        sequelize,
        modelName: 'Genre',
        indexes: [{unique: true, fields: ['name']}]
    });
    return Genre;
};

我正在尝试批量插入具有如下语言和流派的歌曲:

代码语言:javascript
运行
复制
Song.bulkCreate(songs, {
    include: [Genre,Language]
}).then(() => {
    const result = {
        status: "ok",
        message: "Upload Successfully!",
    }
    res.json(result);
});

歌曲数组中的每首歌曲的结构如下:

代码语言:javascript
运行
复制
{
    name: "abc",
    genres: [{name: "abc"}],
    languages: [{name: "English"}],
    energy:  1,
    valence: 1
}

我最终得到了一个满满的歌曲表,但流派和语言都是空的,我做错了什么?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-09-16 23:23:28

不幸的是,bulkCreate不像create那样支持include选项。您应该在事务内的循环中使用create

代码语言:javascript
运行
复制
const transaction = ...
for (const song of songs) {
  await Song.create(song, {
    include: [Genre,Language]
  }, { transaction })
}
await transaction.commit()

或者,您可以使用Promise.all来避免使用for

票数 3
EN

Stack Overflow用户

发布于 2021-11-15 11:27:26

为了防止其他人搜索到这里,从version 5.14 Sequelize开始,添加了使用include option in bulkCreate的选项,如下所示:

代码语言:javascript
运行
复制
await Song.bulkCreate(songsRecordsToCreate, {
    include: [Genre,Language]
})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63922261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档