Upgrade to v6

Sequelize v6 is the next major release after v5. Below is a list of breaking changes to help you upgrade.

Breaking Changes

Support for Node 10 and up

Sequelize v6 will only support Node 10 and up #10821.

CLS

You should now use cls-hooked package for CLS support.

  1. const cls = require("cls-hooked");
  2. const namespace = cls.createNamespace("....");
  3. const Sequelize = require("sequelize");
  4. Sequelize.useCLS(namespace);

Database Engine Support

We have updated our minimum supported database engine versions. Using older database engine will show SEQUELIZE0006 deprecation warning. Please check ENGINE.md for version table.

Sequelize

  • Bluebird has been removed. Internally all methods are now using async/await. Public API now returns native promises. Thanks to Andy Edwards for this refactor work.
  • Sequelize.Promise is no longer available.
  • sequelize.import method has been removed. CLI users should update to [[email protected]](https://sequelize.org/cdn-cgi/l/email-protection).
  • All instances of QueryInterface and QueryGenerator have been renamed to their lowerCamelCase variants eg. queryInterface and queryGenerator when used as property names on Model and Dialect, the class names remain the same.

Model

options.returning

Option returning: true will no longer return attributes that are not defined in the model. Old behavior can be achieved by using returning: ['*'] instead.

Model.changed()

This method now tests for equality with _.isEqual and is now deep aware for JSON objects. Modifying a nested value for a JSON object won’t mark it as changed (since it is still the same object).

  1. const instance = await MyModel.findOne();
  2. instance.myJsonField.someProperty = 12345; // Changed from something else to 12345
  3. console.log(instance.changed()); // false
  4. await instance.save(); // this will not save anything
  5. instance.changed("myJsonField", true);
  6. console.log(instance.changed()); // ['myJsonField']
  7. await instance.save(); // will save

Model.bulkCreate()

This method now throws Sequelize.AggregateError instead of Bluebird.AggregateError. All errors are now exposed as errors key.

Model.upsert()

Native upsert is now supported for all dialects.

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

Signature for this method has been changed to Promise<Model,boolean | null>. First index contains upserted instance, second index contains a boolean (or null) indicating if record was created or updated. For SQLite/Postgres, created value will always be null.

  • MySQL - Implemented with ON DUPLICATE KEY UPDATE
  • PostgreSQL - Implemented with ON CONFLICT DO UPDATE
  • SQLite - Implemented with ON CONFLICT DO UPDATE
  • MSSQL - Implemented with MERGE statement

Note for Postgres users: If upsert payload contains PK field, then PK will be used as the conflict target. Otherwise first unique constraint will be selected as the conflict key.

QueryInterface

addConstraint

This method now only takes 2 parameters, tableName and options. Previously the second parameter could be a list of column names to apply the constraint to, this list must now be passed as options.fields property.

Changelog

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