web-dev-qa-db-fra.com

Sequelize bulkCreate () renvoie la valeur NULL pour la clé primaire

Je suis en train d'écrire reste en utilisant noeud, sequelize comme ORM pour mySQL . Mais en réponse, il renvoie null pour la valeur de la clé primaire.

Modèle

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
    }
});

Opération de création en bloc:

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);
    })

réponse:

[
  {
    "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"
  }
]
11
Sunil Sharma

Vous devriez définir l'option returning:

Model.bulkCreate(values, {returning: true})
15
Adam
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);
})
5
Samantha Bretous

Dans la documentation: veuillez noter que ceux-ci peuvent ne pas représenter complètement l'état des lignes dans la base de données. En effet, MySQL et SQLite ne facilitent pas la récupération des ID générés automatiquement et des autres valeurs par défaut de manière à pouvoir être mappés à plusieurs enregistrements. Pour obtenir des instances pour les valeurs nouvellement créées, vous devez les interroger à nouveau . http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-bulkCreate

Mais vous pouvez passer une option pour lui faire renvoyer l'identifiant

orm.models.category.bulkCreate(data, { returning: true })
2
Finn

Un tableau d'instances est passé au gestionnaire de réussite, mais veuillez noter que celles-ci peuvent ne pas représenter complètement l'état des lignes dans la base de données. En effet, MySQL et SQLite ne facilitent pas la récupération des ID générés automatiquement et des autres valeurs par défaut de manière à pouvoir être mappés à plusieurs enregistrements. Pour obtenir des instances pour les valeurs nouvellement créées, vous devez les interroger à nouveau . http://docs.sequelizejs.com/fr/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

2
Jan Aagaard Meier

Malheureusement, cela ne fonctionne pas dans la dernière version. Ils expliquent pourquoi ici: http://sequelize.readthedocs.org/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

notez que la description mentionne spécifiquement mysql. Vous devrez les interroger. (l'exemple inclut 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);
 });
1
Ben Polge
var data = [{
   'cat_name':'fashion'
  },
  {
   'cat_name':'food'
  }
 ];

orm.models.category.bulkCreate(data,{individualHooks: true})
 .then(function(response){
   res.json(response);
 })
 .catch(function(error){
   res.json(error);
 });
0
HusseinOsman