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.
const cls = require('cls-hooked');
const namespace = cls.createNamespace('....');
const Sequelize = require('sequelize');
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 the releases page for the 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 tosequelize-cli@6
.- 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()
Sequelize does not detect deep mutations. To avoid problems with save
, you should treat each attribute as immutable and only assign new values.
Example with a deep mutation of an attribute:
const instance = await MyModel.findOne();
// Sequelize will not detect this change
instance.jsonField.jsonProperty = 12345;
console.log(instance.changed()); // false
// You can workaround this by telling Sequelize the property changed:
instance.changed('jsonField', true);
console.log(instance.changed()); // true
Example if you treat each attribute as immutable:
const instance = await MyModel.findOne();
// Sequelize will detect this change
instance.jsonField = {
...instance.jsonField,
jsonProperty: 12345,
};
console.log(instance.changed()); // true
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.
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 insequelize.query
#11596 - fix(types): correct overloaded method order #11727
- fix(types):
comparator
arg ofSequelize.where
#11843 - fix(types): fix BelongsToManyGetAssociationsMixinOptions #11818
- fix(types): adds
hooks
toCreateOptions
#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