A virtual value that is not stored in the DB. This could for example be useful if you want to provide a default value in your model that is returned to the user but not stored in the DB.

You could also use it to validate a value before permuting and storing it. VIRTUAL also takes a return type and dependency fields as arguments If a virtual attribute is present in attributes it will automatically pull in the extra fields as well. Return type is mostly useful for setups that rely on types like GraphQL.

Example: Checking password length before hashing it

sequelize.define('user', {
password_hash: DataTypes.STRING,
password: {
type: DataTypes.VIRTUAL,
set: function (val) {
// Remember to set the data value, otherwise it won't be validated
this.setDataValue('password', val);
this.setDataValue('password_hash', this.salt + val);
validate: {
isLongEnough: function (val) {
if (val.length < 7) {
throw new Error("Please choose a longer password")

In the above code the password is stored plainly in the password field so it can be validated, but is never stored in the DB.

Example: Virtual with dependency fields

active: {
type: new DataTypes.VIRTUAL(DataTypes.BOOLEAN, ['createdAt']),
get: function() {
return this.get('createdAt') > Date.now() - (7 * 24 * 60 * 60 * 1000)

Type Parameters

  • T

Hierarchy (view full)



#dialect: undefined | AbstractDialect<object, object>
usageContext: undefined | DataTypeUseContext

Where this DataType is being used.



  • Called when a value is retrieved from the Database, and its DataType is specified. Used to normalize values from the database.

    Note: It is also possible to do an initial parsing of a Database value using AbstractDialect#registerDataTypeParser. That normalization uses the type ID from the database instead of a Sequelize Data Type to determine which parser to use, and is called before this method.


    • value: unknown

      The value to parse.

    Returns unknown