sequelize.js TIMESTAMP not DATETIME

71,864

Solution 1

Just pass in 'TIMESTAMP' string to your type

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.createTable('users', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
        created_at: {
        type: 'TIMESTAMP',
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        allowNull: false
      },
      updated_at: {
        type: 'TIMESTAMP',
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        allowNull: false
      }
    });
  }
};

Solution 2

According to the Sequelize Documentation, you can set a defaultValue of Sequelize.NOW to create a timestamp field. This has the effect but relies on Sequelize to actually populate the timestamp. It does not create a "CURRENT_TIMESTAMP' attribute on the table.

var Foo = sequelize.define('Foo', {
    // default values for dates => current time
    myDate: { 
         type: Sequelize.DATE, 
         defaultValue: Sequelize.NOW 
    }
});

So, this does accomplish the end goal of having a timestamp field, but it is controlled through Sequelize and not through the actual database engine.

It also appears to work on databases that do not have a timestamp functionality, so that may be a benefit.

Reference URL: http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition

Solution 3

In my case i create model like below

module.exports = (sequelize, type) => {
    return sequelize.define('blog', {
        blogId: {
          type: type.INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        text: type.STRING,
        createdAt:{
            type: 'TIMESTAMP',
            defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
            allowNull: false
        },
        updatedAt:{
            type: 'TIMESTAMP',
            defaultValue: sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
            allowNull: false
        }
    })
}

enter image description here

Solution 4

You can also use the moment for creating a timestamp:

const moment = require('moment-timezone');

    createdAt: {
      type: DataTypes.NOW,
      allowNull: false,
      defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
      field: 'createdAt'
    },

Solution 5

instead of

 type: DataTypes.DATE,

use below code

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      },
Share:
71,864
ılǝ
Author by

ılǝ

If you ever start taking things too seriously, remind yourself that we are talking monkeys on an organic spaceship traveling through the galaxy. SOreadytohelp

Updated on May 07, 2020

Comments

  • ılǝ
    ılǝ about 4 years

    In my node.js app I have several models in which I want to define TIMESTAMP type columns, including the default timestamps created_at and updated_at.

    According to sequelize.js' documentation, there is only a DATE data type. It creates DATETIME columns in MySQL.

    Example:

    var User = sequelize.define('User', {
    ... // columns
    last_login: {
                type: DataTypes.DATE,
                allowNull: false
            },
    ...
    }, { // options
            timestamps: true
    });
    

    Is it possible to generate TIMESTAMP columns instead?