Sequelize.js TIMESTAMP не DATETIME

В моем приложении node.js у меня есть несколько моделей, в которых я хочу определить столбцы типа TIMESTAMP, включая отметки времени created_at и updated_at по умолчанию.

Согласно документации sequelize.js, существует только тип данных DATE. Он создает столбцы DATETIME в MySQL.

Пример:

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

Возможно ли генерировать столбцы TIMESTAMP?

Ответ 1

Просто перейдите в строку "TIMESTAMP" к вашему типу

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
      }
    });
  }
};

Ответ 2

В соответствии с документацией Sequelize вы можете установить значение по умолчанию для параметра Sequelize.NOW, чтобы создать поле метки времени. Это имеет эффект, но полагается на Sequelize, чтобы фактически заполнить метку времени. Он не создает атрибут "CURRENT_TIMESTAMP" в таблице.

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

Таким образом, это достигает конечной цели создания поля временной метки, но оно контролируется с помощью Sequelize, а не с помощью реального механизма базы данных.

Он также работает с базами данных, которые не имеют функциональности временной метки, поэтому это может быть полезно.

Ссылка URL: http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition

Ответ 3

То, что я сделал с sqlite, - это расширенные DataTypes с моей пользовательской логикой SQL для TIMESTAMP, и она отлично работала. Я не уверен на 100%, как синтаксис sql должен искать MySQL, но я предполагаю, что это похоже на то, что у меня есть. Посмотрите на пример:

function (sequelize, DataTypes) {

    var util = require('util');
    var timestampSqlFunc = function () {
        var defaultSql = 'DATETIME DEFAULT CURRENT_TIMESTAMP';
        if (this._options && this._options.notNull) {
            defaultSql += ' NOT NULL';
        }
        if (this._options && this._options.onUpdate) {
            // onUpdate logic here:
        }
        return defaultSql;
    };
    DataTypes.TIMESTAMP = function (options) {
        this._options = options;
        var date = new DataTypes.DATE();
        date.toSql = timestampSqlFunc.bind(this);
        if (!(this instanceof DataTypes.DATE)) return date;
        DataTypes.DATE.apply(this, arguments);
    };
    util.inherits(DataTypes.TIMESTAMP, DataTypes.DATE);

    DataTypes.TIMESTAMP.prototype.toSql = timestampSqlFunc;

    var table = sequelize.define("table", {
        /* table fields */
        createdAt: DataTypes.TIMESTAMP,
        updatedAt: DataTypes.TIMESTAMP({ onUpdate: true, notNull: true })
    }, {
        timestamps: false
    });

};

Все, что вам нужно сделать для MySQL, - это изменить генерацию типа SQL в функции timestampSqlFunc, поэтому, например, переменная defaultSql будет 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

Ответ 4

В моем случае я создаю модель, как показано ниже

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