批量操作(一次性创建,更新和销毁多行)
除了更新单个实例之外,你还可以一次创建,更新和删除多个实例. 调用你需要的方法
Model.bulkCreate
Model.update
Model.destroy
由于你使用多个模型,回调将不会返回DAO实例. BulkCreate将返回一个模型实例/DAO的数组,但是它们不同于create
,没有 autoIncrement 属性的结果值. update
和 destroy
将返回受影响的行数.
首先看下 bulkCreate
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
]).then(() => { // 注意: 这里没有凭据, 然而现在你需要...
return User.findAll();
}).then(users => {
console.log(users) // ... 以获取 user 对象的数组
})
插入多行并返回所有列(仅限Postgres):
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
], { returning: true }) // 将返回插入的每一行的所有列
.then((result) => {
console.log(result);
});
插入多行并返回特定列(仅限Postgres):
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
], { returning: ['username'] }) // 将仅返回插入的每行的指定列
.then((result) => {
console.log(result);
});
一次更新几行:
Task.bulkCreate([
{subject: 'programming', status: 'executing'},
{subject: 'reading', status: 'executing'},
{subject: 'programming', status: 'finished'}
]).then(() => {
return Task.update(
{ status: 'inactive' }, /* 设置属性的值 */
{ where: { subject: 'programming' }} /* where 规则 */
);
}).then(([affectedCount, affectedRows]) => {
// 请注意,affectedRows 只支持以 returning: true 的方式进行定义
// affectedCount 将会是 2
return Task.findAll();
}).then(tasks => {
console.log(tasks) // “programming” 任务都将处于 “inactive” 状态
})
然后删除它们:
Task.bulkCreate([
{subject: 'programming', status: 'executing'},
{subject: 'reading', status: 'executing'},
{subject: 'programming', status: 'finished'}
]).then(() => {
return Task.destroy({
where: {
subject: 'programming'
},
truncate: true /* 这将忽 where 并用 truncate table 替代 */
});
}).then(affectedRows => {
// affectedRows 将会是 2
return Task.findAll();
}).then(tasks => {
console.log(tasks) // 显示 tasks 内容
})
如果你直接从 user 接受值,则限制要实际插入的列可能会更好.bulkCreate()
接受一个选项对象作为第二个参数. 该对象可以有一个 fields
参数(一个数组),让它知道你想要明确构建哪些字段
User.bulkCreate([
{ username: 'foo' },
{ username: 'bar', admin: true}
], { fields: ['username'] }).then(() => {
// admin 将不会被构建
})
bulkCreate
最初是成为 主流/快速 插入记录的方法,但是有时你希望能够同时插入多行而不牺牲模型验证,即使你明确地告诉 Sequelize 去筛选哪些列. 你可以通过在options对象中添加一个 validate: true
属性来实现.
class Tasks extends Model {}
Tasks.init({
name: {
type: Sequelize.STRING,
validate: {
notNull: { args: true, msg: 'name cannot be null' }
}
},
code: {
type: Sequelize.STRING,
validate: {
len: [3, 10]
}
}
}, { sequelize, modelName: 'tasks' })
Tasks.bulkCreate([
{name: 'foo', code: '123'},
{code: '1234'},
{name: 'bar', code: '1'}
], { validate: true }).catch(errors => {
/* console.log(errors) 看起来像这样:
[
{ record:
...
name: 'SequelizeBulkRecordError',
message: 'Validation error',
errors:
{ name: 'SequelizeValidationError',
message: 'Validation error',
errors: [Object] } },
{ record:
...
name: 'SequelizeBulkRecordError',
message: 'Validation error',
errors:
{ name: 'SequelizeValidationError',
message: 'Validation error',
errors: [Object] } }
]
*/
})