static/v5/manual/upgrade-to-v5.html
Sequelize v5 is the next major release after v4
Sequelize v5 will only support Node 6 and up #9015
With v4 you started to get a deprecation warning String based operators are now deprecated. Also concept of operators was introduced. These operators are Symbols which prevent hash injection attacks.
With v5
operatorsAliases, but that will give you deprecation warning.Sequelize now ship official typings #10287. You can consider migrating away from external typings which may get out of sync.
With v5 Sequelize now use sequelize-pool which is a modernized fork of [email protected]. You no longer need to call sequelize.close to shutdown pool, this helps with lambda executions. #8468
Validators
Custom validators defined per attribute (as opposed to the custom validators defined in the model's options) now run when the attribute's value is null and allowNull is true (while previously they didn't run and the validation succeeded immediately). To avoid problems when upgrading, please check all your custom validators defined per attribute, where allowNull is true, and make sure all these validators behave correctly when the value is null. See #9143.
Attributes
Model.attributes now removed, use Model.rawAttributes. #5320
Note : Please don't confuse this with options.attributes, they are still valid
Paranoid Mode
With v5 if deletedAt is set, record will be considered as deleted. paranoid option will only use deletedAt as flag. #8496
Model.bulkCreate
updateOnDuplicate option which used to accept boolean and array, now only accepts non-empty array of attributes. #9288
Underscored Mode
Implementation of Model.options.underscored is changed. You can find full specifications here.
Main outline
underscoredAll and underscored options are merged into single underscored optionunderscored option set to true, the field option for attributes will be set as underscored version of attribute name.underscored will control all attributes including timestamps, version and foreign keys. It will not affect any attribute which already specifies the field option.Removed aliases
Many model based aliases has been removed #9372
| Removed in v5 | Official Alternative |
|---|---|
| insertOrUpdate | upsert |
| find | findOne |
| findAndCount | findAndCountAll |
| findOrInitialize | findOrBuild |
| updateAttributes | update |
| findById, findByPrimary | findByPk |
| all | findAll |
| hook | addHook |
Range
Now supports only one standard format [{ value: 1, inclusive: true }, { value: 20, inclusive: false }] #9364
Case insensitive text
Added support for CITEXT for Postgres and SQLite
Removed
NONE type has been removed, use VIRTUAL instead
Removed aliases
Hooks aliases has been removed #9372
| Removed in v5 | Official Alternative |
|---|---|
| [after,before]BulkDelete | [after,before]BulkDestroy |
| [after,before]Delete | [after,before]Destroy |
| beforeConnection | beforeConnect |
Removed aliases
Prototype references for many constants, objects and classes has been removed #9372
| Removed in v5 | Official Alternative |
|---|---|
| Sequelize.prototype.Utils | Sequelize.Utils |
| Sequelize.prototype.Promise | Sequelize.Promise |
| Sequelize.prototype.TableHints | Sequelize.TableHints |
| Sequelize.prototype.Op | Sequelize.Op |
| Sequelize.prototype.Transaction | Sequelize.Transaction |
| Sequelize.prototype.Model | Sequelize.Model |
| Sequelize.prototype.Deferrable | Sequelize.Deferrable |
| Sequelize.prototype.Error | Sequelize.Error |
| Sequelize.prototype[error] | Sequelize[error] |
import Sequelize from 'sequelize';
const sequelize = new Sequelize('postgres://user:[email protected]:mydb');
/**
* In v4 you can do this
*/
console.log(sequelize.Op === Sequelize.Op) // logs `true`
console.log(sequelize.UniqueConstraintError === Sequelize.UniqueConstraintError) // logs `true`
Model.findAll({
where: {
[sequelize.Op.and]: [ // Using sequelize.Op or Sequelize.Op interchangeably
{
name: "Abc"
},
{
age: {
[Sequelize.Op.gte]: 18
}
}
]
}
}).catch(sequelize.ConnectionError, () => {
console.error('Something wrong with connection?');
});
/**
* In v5 aliases has been removed from Sequelize prototype
* You should use Sequelize directly to access Op, Errors etc
*/
Model.findAll({
where: {
[Sequelize.Op.and]: [ // Don't use sequelize.Op, use Sequelize.Op instead
{
name: "Abc"
},
{
age: {
[Sequelize.Op.gte]: 18
}
}
]
}
}).catch(Sequelize.ConnectionError, () => {
console.error('Something wrong with connection?');
});
changeColumn no longer generates constraint with _idx suffix. Now Sequelize does not specify any name for constraints thus defaulting to database engine naming. This aligns behavior of sync, createTable and changeColumn.addIndex aliases options aliases have been removed, use the following instead.
indexName => nameindicesType => typeindexType/method => usingValidationErrorItem now holds reference to original error in the original property, rather than the __raw property.3.1.0, which use any-promise. This module repeat all sequelize.query operations. You can configure any-promise to use bluebird for better performance on Node 4 or 6undefined keys in where options, In past versions undefined was converted to null.tedious >= 6.0.0. Old dialectOptions has to be updated to match their new format. Please refer to tedious documentation. An example of new dialectOptions is given belowdialectOptions: {
authentication: {
domain: 'my-domain'
},
options: {
requestTimeout: 60000,
cryptoCredentialsDetails: {
ciphers: "RC4-MD5"
}
}
}
mysql2 >= 1.5.2 for prepared statementsdialect: 'mariadb' is now supported with mariadb packagegeneric-poolsequelize-pool[email protected] #10494attribute.column.validate option #10237