2015-04-15 12 views
11

Trong ứng dụng node.js của tôi, tôi có một số mô hình mà tôi muốn xác định các cột loại TIMESTAMP, bao gồm dấu thời gian mặc định created_atupdated_at.sequelize.js TIMESTAMP không DATETIME

Theo sequelize.js' documentation, chỉ có DATE loại dữ liệu. Nó tạo ra các cột DATETIME trong MySQL.

Ví dụ:

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

Có thể tạo TIMESTAMP cột để thay thế?

Trả lời

0

Những gì tôi đã có SQLite được mở rộng kiểu dữ liệu với logic tùy chỉnh sql của tôi cho dấu thời gian và nó làm việc tốt. Tôi không chắc chắn làm thế nào cú pháp sql nên tìm MySQL nhưng tôi đoán nó là một cái gì đó tương tự như những gì tôi có. Nhìn vào ví dụ:

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

}; 

Tất cả bạn cần làm cho MySQL là thay đổi SQL loại thế hệ trong timestampSqlFunc chức năng, ví dụ như vậy defaultSql biến sẽ 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

2

Theo Sequelize Tài liệu, bạn có thể đặt defaultValue của Sequelize.NOW để tạo trường dấu thời gian. Điều này có hiệu lực nhưng dựa trên Sequelize để thực sự điền dấu thời gian. Nó không tạo ra một "thuộc tính CURRENT_TIMESTAMP' trên bàn.

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

Vì vậy, điều này không hoàn thành mục tiêu cuối cùng của việc có một lĩnh vực dấu thời gian, nhưng nó được điều khiển thông qua Sequelize và không thông qua cơ sở dữ liệu thực tế.

Nó cũng xuất hiện để làm việc trên cơ sở dữ liệu mà không có một chức năng dấu thời gian, do đó có thể là một lợi ích

URL tham khảo:. http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition

+0

defaultValue: Sequelize.NOW không hoạt động – alucic

4

Chỉ cần vượt qua trong chuỗi 'dấu thời gian' với loại hình

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