Upgrade to v6 - 升级到 V6

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

重大变化

支持 Node 10 以及更高

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

CLS

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

  1. const cls = require('cls-hooked');
  2. const namespace = cls.createNamespace('....');
  3. const Sequelize = require('sequelize');
  4. 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 对象的嵌套值不会将其标记为已更改(因为它仍然是同一对象).

  1. const instance = await MyModel.findOne();
  2. instance.myJsonField.someProperty = 12345; // 更改为 12345
  3. console.log(instance.changed()); // false
  4. await instance.save(); // 这不会保存任何东西
  5. instance.changed("myJsonField", true);
  6. console.log(instance.changed()); // ['myJsonField']
  7. await instance.save(); // 将会保存

Model.bulkCreate()

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

Model.upsert()

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

  1. 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 属性传递.

变更日志

6.0.0-beta.7

  • docs(associations): belongs to many create with through table
  • docs(query-interface): fix broken links #12272
  • docs(sequelize): omitNull only works for CREATE/UPDATE queries
  • docs: asyncify #12297
  • docs: responsive #12308
  • docs: update feature request template
  • feat(postgres): native upsert #12301
  • feat(sequelize): allow passing dialectOptions.options from url #12404
  • fix(include): check if attributes specified for included through model #12316
  • fix(model.destroy): return 0 with truncate #12281
  • fix(mssql): empty order array generates invalid FETCH statement #12261
  • fix(postgres): parse enums correctly when describing a table #12409
  • fix(query): ensure correct return signature for QueryTypes.RAW #12305
  • fix(query): preserve cls context for logger #12328
  • fix(query-generator): do not generate GROUP BY clause if options.group is empty #12343
  • fix(reload): include default scope #12399
  • fix(types): add Association into OrderItem type #12332
  • fix(types): add clientMinMessages to Options interface #12375
  • fix(types): transactionType in Options #12377
  • fix(types): add support for optional values in “where” clauses #12337
  • fix(types): add missing fields to ‘FindOrCreateType’ #12338
  • fix: add missing sql and parameters properties to some query errors #12299
  • fix: remove custom inspect #12262
  • refactor: cleanup query generators #12304

6.0.0-beta.6

  • docs(add-constraint): options.fields support
  • docs(association): document uniqueKey for belongs to many #12166
  • docs(association): options.through.where support
  • docs(association): use and instead of ‘a nd’ #12191
  • docs(association): use correct scope name #12204
  • docs(manuals): avoid duplicate header ids #12201
  • docs(model): correct syntax error in example code #12137
  • docs(query-interface): removeIndex indexNameOrAttributes #11947
  • docs(resources): add sequelize-guard library #12235
  • docs(typescript): fix confusing comments #12226
  • docs(v6-guide): bluebird removal API changes
  • docs: database version support info #12168
  • docs: remove remaining bluebird references #12167
  • feat(belongs-to-many): allow creation of paranoid join tables #12088
  • feat(belongs-to-many): get/has/count for paranoid join table #12256
  • feat(pool): expose maxUses pool config option #12101
  • feat(postgres): minify include aliases over limit #11940
  • feat(sequelize): handle query string host value #12041
  • fix(associations): ensure correct schema on all generated attributes #12258
  • fix(docs/instances): use correct variable for increment #12087
  • fix(include): separate queries are not sub-queries #12144
  • fix(model): fix unchained promise in association logic in bulkCreate #12163
  • fix(model): updateOnDuplicate handles composite keys #11984
  • fix(model.count): distinct without any column generates invalid SQL #11946
  • fix(model.reload): ignore options.where and always use this.where() #12211
  • fix(mssql) insert record failure because of BOOLEAN column type #12090
  • fix(mssql): cast sql_variant in query generator #11994
  • fix(mssql): dont use OUTPUT INSERTED for update without returning #12260
  • fix(mssql): duplicate order in FETCH/NEXT queries #12257
  • fix(mssql): set correct scale for float #11962
  • fix(mssql): tedious v9 requires connect call #12182
  • fix(mssql): use uppercase for engine table and columns #12212
  • fix(pool): show deprecation when engine is not supported #12218
  • fix(postgres): addColumn support ARRAY(ENUM) #12259
  • fix(query): do not bind \$ used within a whole-word #12250
  • fix(query-generator): handle literal for substring based operators #12210
  • fix(query-interface): allow passing null for query interface insert #11931
  • fix(query-interface): allow sequelize.fn and sequelize.literal in fields of IndexesOptions #12224
  • fix(scope): don’t modify original scope definition #12207
  • fix(sqlite): multiple primary keys results in syntax error #12237
  • fix(sync): pass options to all query methods #12208
  • fix(typings): add type_helpers to file list #12000
  • fix(typings): correct Model.init return type #12148
  • fix(typings): fn is assignable to where #12040
  • fix(typings): getForeignKeysForTables argument definition #12084
  • fix(typings): make between operator accept date ranges #12162
  • refactor(ci): improve database wait script #12132
  • refactor(tsd-test-setup): add & setup dtslint #11879
  • refactor: move all dialect conditional logic into subclass #12217
  • refactor: remove sequelize.import helper #12175
  • refactor: use native versions #12159
  • refactor: use object spread instead of Object.assign #12213

6.0.0-beta.5

  • fix(find-all): throw on empty attributes #11867
  • fix(types): queryInterface.addIndex #11844
  • fix(types): plain option in sequelize.query #11596
  • fix(types): correct overloaded method order #11727
  • fix(types): comparator arg of Sequelize.where #11843
  • fix(types): fix BelongsToManyGetAssociationsMixinOptions #11818
  • fix(types): adds hooks to CreateOptions #11736
  • fix(increment): broken queries #11852
  • fix(associations): gets on many-to-many with non-primary target key #11778
  • fix: properly select SRID if present #11763
  • feat(sqlite): automatic path provision for options.storage #11853
  • feat(postgres): idle_in_transaction_session_timeout connection option #11775
  • feat(index): improve to support multiple fields with operator #11934
  • docs(transactions): fix addIndex example and grammar #11759
  • docs(raw-queries): remove outdated info #11833
  • docs(optimistic-locking): fix missing manual #11850
  • docs(model): findOne return value for empty result #11762
  • docs(model-querying-basics.md): add some commas #11891
  • docs(manuals): fix missing models-definition page #11838
  • docs(manuals): extensive rewrite #11825
  • docs(dialect-specific): add MSSQL domain auth example #11799
  • docs(associations): fix typos in assocs manual #11888
  • docs(associations): fix typo #11869

6.0.0-beta.4

  • feat(sync): allow to bypass drop statements when sync with alter enabled #11708
  • fix(model): injectDependentVirtualAttrs on included models #11713
  • fix(model): generate ON CONFLICT … DO UPDATE correctly #11666
  • fix(mssql): optimize formatError RegEx #11725
  • fix(types): add getForeignKeyReferencesForTable type #11738
  • fix(types): add ‘restore’ hooks to types #11730
  • fix(types): added ‘fieldMaps’ to QueryOptions typings #11702
  • fix(types): add isSoftDeleted to Model #11628
  • fix(types): fix upsert typing #11674
  • fix(types): specified ‘this’ for getters and setters in fields #11648
  • fix(types): add paranoid to UpdateOptions interface #11647
  • fix(types): include ‘as’ in IncludeThroughOptions definition #11624
  • fix(types): add Includeable to IncludeOptions.include type #11622
  • fix(types): transaction lock #11620
  • fix(sequelize.fn): escape dollarsign (#11533) #11606
  • fix(types): add nested to Includeable #11354
  • fix(types): add date to where #11612
  • fix(types): add getDatabaseName (#11431) #11614
  • fix(types): beforeDestroy #11618
  • fix(types): query-interface table schema #11582
  • docs: README.md #11698
  • docs(sequelize): detail options.retry usage #11643
  • docs: clarify logging option in Sequelize constructor #11653
  • docs(migrations): fix syntax error in example #11626
  • docs: describe logging option #11654
  • docs(transaction): fix typo #11659
  • docs(hooks): add info about belongs-to-many #11601
  • docs(associations): fix typo #11592

6.0.0-beta.3

  • feat: support cls-hooked / tests #11584

6.0.0-beta.2

  • feat(postgres): change returning option to only return model attributes #11526
  • fix(associations): allow binary key for belongs-to-many #11578
  • fix(postgres): always replace returning statement for upsertQuery
  • fix(model): make .changed() deep aware #10851
  • change: use node 10 #11580