2015-04-15 24 views
11

Nella mia app node.js ho diversi modelli in cui voglio definire le colonne di tipo TIMESTAMP, compresi i timestamp predefiniti created_at e updated_at.sequelize.js TIMESTAMP non DATETIME

In base a sequelize.js' documentation, c'è solo un tipo di dati DATE. Crea colonne DATETIME in MySQL.

Esempio:

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

E 'possibile generare TIMESTAMP colonne, invece?

risposta

0

quello che ho fatto con SQLite si estende DataTypes con la mia logica SQL personalizzata per TIMESTAMP e ha funzionato bene. Non sono sicuro al 100% di come la sintassi sql debba cercare MySQL, ma suppongo che sia qualcosa di simile a quello che ho. Guardate ad esempio:

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

}; 

Tutto quello che devi fare per MySQL è quello di cambiare il tipo SQL generazione timestampSqlFunc funzione, così per esempio defaultSql variabile sarebbe 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

2

Secondo il Sequelize Documentazione, è possibile impostare un valore predefinito di Sequelize.NOW per creare un campo data/ora. Questo ha l'effetto ma si basa su Sequelize per popolare effettivamente il timestamp. Non crea un attributo "CURRENT_TIMESTAMP' sul tavolo.

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

Quindi, questo fa realizzare l'obiettivo finale di avere un campo timestamp, ma è controllato attraverso Sequelize e non attraverso il motore di database vero e proprio.

sembra anche di lavorare su basi di dati che non dispongono di una funzionalità di timestamp, in modo che possa essere un vantaggio

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

+0

defaultValue: Sequelize.NOW non funziona – alucic

4

Basta passare nella stringa 'tIMESTAMP' al vostro tipo

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