web-dev-qa-db-ja.com

Sequelize bulkCreate()は主キーにNULL値を返します

ノードを使用して残りを記述し、mySQLのORMとして続編します。 bulkCreate関数を使用して、レコードを一括で作成しています。しかし、応答では、主キー値に対してnullを返します。

モデル

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

一括作成操作:

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

応答:

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

returningオプションを設定する必要があります。

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

MySQLでテスト済み:

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

20
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

ドキュメントから:これらはDB内の行の状態を完全に表していない可能性があることに注意してください。これは、MySQLとSQLiteが複数のレコードにマッピングできる方法で自動生成されたIDやその他のデフォルト値を簡単に取得することができないためです。新しく作成された値のインスタンスを取得するには、それらを再度クエリする必要があります。 http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-bulkCreate

ただし、idを返すオプションを渡すことができます

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

成功ハンドラにはインスタンスの配列が渡されますが、これらはDB内の行の状態を完全に表していない場合があることに注意してください。これは、MySQLとSQLiteが複数のレコードにマッピングできる方法で自動生成されたIDやその他のデフォルト値を簡単に取得することができないためです。新しく作成された値のインスタンスを取得するには、それらを再度クエリする必要があります。 http://docs.sequelizejs.com/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

2

残念ながら、最新バージョンでは機能しません。彼らはここで理由を説明します: http://sequelize.readthedocs.org/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

説明では特にmysqlに言及していることに注意してください。それらを照会する必要があります。 (例には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