web-dev-qa-db-fra.com

sequelize.js TIMESTAMP pas DATETIME

Dans mon application node.js, j'ai plusieurs modèles dans lesquels je veux définir des colonnes de type TIMESTAMP, notamment les horodatages par défaut created_at et updated_at

Selon la documentation de sequelize.js , il n'y a qu'un type de données DATE. Il crée des colonnes DATETIME dans MySQL.

Exemple:

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

Est-il possible de générer des colonnes TIMESTAMP à la place?

12
ılǝ

Passez simplement la chaîne 'TIMESTAMP' à votre 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
      }
    });
  }
};
6
alucic

Selon la documentation de Sequelize, vous pouvez définir une valeur par défaut de Sequelize.NOW pour créer un champ d'horodatage. Cela a l'effet, mais repose sur Sequelize pour renseigner l'horodatage. Il ne crée pas d'attribut "CURRENT_TIMESTAMP 'sur la table. 

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

Ainsi, l'objectif final est d'avoir un champ d'horodatage, mais il est contrôlé par Sequelize et non par le moteur de base de données réel.

Il semble également que cela fonctionne sur les bases de données n’ayant pas de fonctionnalité d’horodatage, ce qui peut être un avantage.

URL de référence: http://sequelize.readthedocs.org/fr/latest/docs/models-definition/#definition

2
Nate Stone

Ce que j'ai fait avec sqLite est étendu DataTypes avec ma logique sql personnalisée pourTIMESTAMPet cela a bien fonctionné. Je ne suis pas sûr à 100% de ce que la syntaxe SQL devrait ressembler à MySQL, mais je suppose que c'est quelque chose de similaire à ce que j'ai. Regardez l'exemple:

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

};

Tout ce que vous devez faire pour MySQL est de changer la génération de type SQL dans timestampSqlFunc function, ainsi, par exemple, defaultSql variable serait 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

0
Andrey Borisko