it-swarm.com.ru

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?

12
ılǝ

Просто введите строку «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
      }
    });
  }
};
6
alucic

В соответствии с документацией 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

2
Nate Stone

То, что я сделал с 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 function, поэтому, например, defaultSql variable будет 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

0
Andrey Borisko