Sequelize bulkCreate() returns NULL value for primary key

62,080

Solution 1

You should set the returning option:

Model.bulkCreate(values, {returning: true})

Solution 2

Tested in MySQL:

Model.bulkCreate(values, { individualHooks: true })

Solution 3

var data = [
    {
        'cat_name':'fashion'
    },
    {
        'cat_name':'food'
    }
];

Model.bulkCreate(data)
.then(function() {

 //(if you try to immediately return the Model after bulkCreate, the ids may all show up as 'null')
  return Model.findAll()
})
.then(function(response){
    res.json(response);
})
.catch(function(error){
    res.json(error);
})

Solution 4

The success handler is passed an array of instances, but please notice that these may not completely represent the state of the rows in the DB. This is because MySQL and SQLite do not make it easy to obtain back automatically generated IDs and other default values in a way that can be mapped to multiple records. To obtain Instances for the newly created values, you will need to query for them again. http://docs.sequelizejs.com/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

Solution 5

Unfortunately that doesn't work in the latest version. They explain why here: http://sequelize.readthedocs.org/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

note that the description specifically mentions mysql. You'll have to query for them. (example includes var _ = require('lodash');

var cat = rm.models.category;
cat.bulkCreate(data)
 .then(function (instances) {
    var names = _.map(instances, function (inst) {
      return inst.cat_name;
    });
    return cat.findAll({where: {cat_name: {$in: names}}); 
 })
 .then(function(response){
    res.json(response);
 })
 .catch(function(error){
    res.json(error);
 });
Share:
62,080
Sunil Sharma
Author by

Sunil Sharma

I am a very positive thinker and enthusiastic web developer, I always keen to learn new technologies, best programming practices. Well I am a Software Engineer with a particular interest in JavaScript and frameworks/libs runs over it, Java/J2EE. I also do lot of work in database schema designing, HTML, CSS and several other languages. I have been doing this professionally for 2.5 years. My blog site is on the way ..!! SOreadytohelp

Updated on December 20, 2020

Comments

  • Sunil Sharma
    Sunil Sharma over 3 years

    I am writing rest using node, sequelize as ORM for mySQL. I am using bulkCreate function to create record in bulk. But in response it is returning null for primary key value.

    Model

    sequelize.define('category', {
        cat_id:{
            type:DataTypes.INTEGER,
            field:'cat_id',
            primaryKey: true,
            autoIncrement: true,
            unique:true
        },
        cat_name:{
            type: DataTypes.STRING,
            field: 'cat_name',
            defaultValue:null
        }
    });
    

    Bulk Create operation :

    var data = [
            {
                'cat_name':'fashion'
            },
            {
                'cat_name':'food'
            }
        ];
    
        orm.models.category.bulkCreate(data)
        .then(function(response){
            res.json(response);
        })
        .catch(function(error){
            res.json(error);
        })
    

    response :

    [
      {
        "cat_id": null,
        "cat_name": "fashion",
        "created_at": "2016-01-29T07:39:50.000Z",
        "updated_at": "2016-01-29T07:39:50.000Z"
      },
      {
        "cat_id": null,
        "cat_name": "food",
        "created_at": "2016-01-29T07:39:50.000Z",
        "updated_at": "2016-01-29T07:39:50.000Z"
      }
    ]