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