批量操作(一次性创建,更新和销毁多行)

除了更新单个实例之外,你还可以一次创建,更新和删除多个实例. 调用你需要的方法

  • Model.bulkCreate
  • Model.update
  • Model.destroy

由于你使用多个模型,回调将不会返回DAO实例. BulkCreate将返回一个模型实例/DAO的数组,但是它们不同于create,没有 autoIncrement 属性的结果值. updatedestroy 将返回受影响的行数.

首先看下 bulkCreate

  1. User.bulkCreate([
  2. { username: 'barfooz', isAdmin: true },
  3. { username: 'foo', isAdmin: true },
  4. { username: 'bar', isAdmin: false }
  5. ]).then(() => { // 注意: 这里没有凭据, 然而现在你需要...
  6. return User.findAll();
  7. }).then(users => {
  8. console.log(users) // ... 以获取 user 对象的数组
  9. })

插入多行并返回所有列(仅限Postgres):

  1. User.bulkCreate([
  2. { username: 'barfooz', isAdmin: true },
  3. { username: 'foo', isAdmin: true },
  4. { username: 'bar', isAdmin: false }
  5. ], { returning: true }) // 将返回插入的每一行的所有列
  6. .then((result) => {
  7. console.log(result);
  8. });

插入多行并返回特定列(仅限Postgres):

  1. User.bulkCreate([
  2. { username: 'barfooz', isAdmin: true },
  3. { username: 'foo', isAdmin: true },
  4. { username: 'bar', isAdmin: false }
  5. ], { returning: ['username'] }) // 将仅返回插入的每行的指定列
  6. .then((result) => {
  7. console.log(result);
  8. });

一次更新几行:

  1. Task.bulkCreate([
  2. {subject: 'programming', status: 'executing'},
  3. {subject: 'reading', status: 'executing'},
  4. {subject: 'programming', status: 'finished'}
  5. ]).then(() => {
  6. return Task.update(
  7. { status: 'inactive' }, /* 设置属性的值 */
  8. { where: { subject: 'programming' }} /* where 规则 */
  9. );
  10. }).then(([affectedCount, affectedRows]) => {
  11. // 请注意,affectedRows 只支持以 returning: true 的方式进行定义
  12. // affectedCount 将会是 2
  13. return Task.findAll();
  14. }).then(tasks => {
  15. console.log(tasks) // “programming” 任务都将处于 “inactive” 状态
  16. })

然后删除它们:

  1. Task.bulkCreate([
  2. {subject: 'programming', status: 'executing'},
  3. {subject: 'reading', status: 'executing'},
  4. {subject: 'programming', status: 'finished'}
  5. ]).then(() => {
  6. return Task.destroy({
  7. where: {
  8. subject: 'programming'
  9. },
  10. truncate: true /* 这将忽 where 并用 truncate table 替代 */
  11. });
  12. }).then(affectedRows => {
  13. // affectedRows 将会是 2
  14. return Task.findAll();
  15. }).then(tasks => {
  16. console.log(tasks) // 显示 tasks 内容
  17. })

如果你直接从 user 接受值,则限制要实际插入的列可能会更好.bulkCreate() 接受一个选项对象作为第二个参数. 该对象可以有一个 fields 参数(一个数组),让它知道你想要明确构建哪些字段

  1. User.bulkCreate([
  2. { username: 'foo' },
  3. { username: 'bar', admin: true}
  4. ], { fields: ['username'] }).then(() => {
  5. // admin 将不会被构建
  6. })

bulkCreate 最初是成为 主流/快速 插入记录的方法,但是有时你希望能够同时插入多行而不牺牲模型验证,即使你明确地告诉 Sequelize 去筛选哪些列. 你可以通过在options对象中添加一个 validate: true 属性来实现.

  1. class Tasks extends Model {}
  2. Tasks.init({
  3. name: {
  4. type: Sequelize.STRING,
  5. validate: {
  6. notNull: { args: true, msg: 'name cannot be null' }
  7. }
  8. },
  9. code: {
  10. type: Sequelize.STRING,
  11. validate: {
  12. len: [3, 10]
  13. }
  14. }
  15. }, { sequelize, modelName: 'tasks' })
  16. Tasks.bulkCreate([
  17. {name: 'foo', code: '123'},
  18. {code: '1234'},
  19. {name: 'bar', code: '1'}
  20. ], { validate: true }).catch(errors => {
  21. /* console.log(errors) 看起来像这样:
  22. [
  23. { record:
  24. ...
  25. name: 'SequelizeBulkRecordError',
  26. message: 'Validation error',
  27. errors:
  28. { name: 'SequelizeValidationError',
  29. message: 'Validation error',
  30. errors: [Object] } },
  31. { record:
  32. ...
  33. name: 'SequelizeBulkRecordError',
  34. message: 'Validation error',
  35. errors:
  36. { name: 'SequelizeValidationError',
  37. message: 'Validation error',
  38. errors: [Object] } }
  39. ]
  40. */
  41. })