跳到主要内容

升级到 V6

Sequelize v6 是 v5 之后的下一个主要版本. 以下列出了一些重大更改以帮助你进行升级.

重大变化

支持 Node 10 以及更高

Sequelize v6 将支持 Node 10 及更高版本 #10821.

CLS

你现在应该使用 cls-hooked 软件包来支持 CLS.

const cls = require('cls-hooked');
const namespace = cls.createNamespace('....');
const Sequelize = require('sequelize');

Sequelize.useCLS(namespace);

数据库引擎支持

我们已经更新了最低支持的数据库引擎版本. 使用较旧的数据库引擎将显示 SEQUELIZE0006 弃用警告。

Sequelize

  • Bluebird 已被移除. 内部所有方法现在都使用 async/await. 公共 API 现在返回原生 promises. 感谢 Andy Edwards 的重构工作.
  • Sequelize.Promise 不再被提供.
  • sequelize.import 方法已被删除. CLI 用户应更新到 sequelize-cli@6.
  • QueryInterface 和 QueryGenerator 的所有实例都已重命名为它们的小写驼峰别名形式,例如: queryInterface 和 queryGenerator 用作 '模型' 和 '方言' 上的属性名称时,类名称保持不变.

模型

options.returning

参数 returning: true 将不再返回模型中未定义的属性. 之前旧的行为可以通过使用 returning: ['*'] 来实现.

Model.changed()

现在,此方法使用 _.isEqual 进行相等性测试,并且现在可以识别 JSON 对象. 修改 JSON 对象的嵌套值不会将其标记为已更改(因为它仍然是同一对象).

const instance = await MyModel.findOne();

instance.myJsonField.someProperty = 12345; // 更改为 12345
console.log(instance.changed()); // false

await instance.save(); // 这不会保存任何东西

instance.changed("myJsonField", true);
console.log(instance.changed()); // ['myJsonField']

await instance.save(); // 将会保存

Model.bulkCreate()

这个方法现在抛出 Sequelize.AggregateError 而不是 Bluebird.AggregateError. 现在, 所有错误都显示为 errors 标识.

Model.upsert()

现在所有语言都支持原生 upsert.

const [instance, created] = await MyModel.upsert({});

此方法的签名已更改为 Promise<Model,boolean | null>. 第一个索引包含被 upsert 的 instance, 第二个索引包含一个布尔值(或null), 指示记录是创建还是更新。 对于SQLite/Postgres,created 值将始终为 null

  • MySQL - 使用 ON DUPLICATE KEY UPDATE 实现
  • PostgreSQL - 使用 ON CONFLICT DO UPDATE 实现
  • SQLite - 使用 ON CONFLICT DO UPDATE 实现
  • MSSQL - 使用 MERGE 语句实现

Postgres 用户需要注意: 如果 upsert 有效负载包含 PK 字段, 则 PK 将用作冲突目标. 否则, 将选择第一个唯一约束作为冲突键.

查询接口

addConstraint

现在, 此方法仅使用2个参数, 即 tableNameoptions. 以前, 第二个参数是要应用约束的列名列表,此列表现在必须作为 options.fields 属性传递.