我正在使用node编写休息,sequelize作为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"
}
]
答案 0 :(得分:20)
您应该设置returning
选项:
Model.bulkCreate(values, {returning: true})
答案 1 :(得分:18)
在MySQL中测试:
Model.bulkCreate(values, { individualHooks: true })
答案 2 :(得分:5)
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);
})
答案 3 :(得分:2)
成功处理程序传递了一个实例数组,但请注意,这些实例可能并不完全代表数据库中行的状态。这是因为MySQL和SQLite不能以一种可以映射到多个记录的方式轻松获取自动生成的ID和其他默认值。要获取新创建的值的实例,您需要再次查询它们。 http://docs.sequelizejs.com/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance
答案 4 :(得分:2)
从文档中:请注意,这些可能并不完全代表数据库中行的状态。这是因为MySQL和SQLite不能以一种可以映射到多个记录的方式轻松获取自动生成的ID和其他默认值。要获取新创建的值的实例,您需要再次查询它们。 http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-bulkCreate
但是你可以传递一个选项让它返回id
orm.models.category.bulkCreate(data, { returning: true })
答案 5 :(得分:1)
不幸的是,这在最新版本中不起作用。他们在这里解释原因: 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);
});
答案 6 :(得分:0)
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);
});