sequelize.js TIMESTAMP 不是 DATETIME

Posted

技术标签:

【中文标题】sequelize.js TIMESTAMP 不是 DATETIME【英文标题】:sequelize.js TIMESTAMP not DATETIME 【发布时间】:2015-06-21 13:12:32 【问题描述】:

在我的 node.js 应用程序中,我有几个模型,我想在其中定义 TIMESTAMP 类型列,包括默认时间戳 created_atupdated_at

根据sequelize.js' documentation,只有DATE 数据类型。它在 mysql 中创建 DATETIME 列。

例子:

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

是否可以改为生成TIMESTAMP 列?

【问题讨论】:

【参考方案1】:

只需将 '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
      
    );
  
;

【讨论】:

【参考方案2】:

根据 Sequelize 文档,您可以设置 Sequelize.NOW 的 defaultValue 来创建时间戳字段。这有效果,但依赖于 Sequelize 来实际填充时间戳。它不会在表上创建“CURRENT_TIMESTAMP”属性。

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

所以,这确实实现了拥有时间戳字段的最终目标,但它是通过 Sequelize 控制的,而不是通过实际的数据库引擎。

它似乎也适用于没有时间戳功能的数据库,所以这可能是一个好处。

参考网址:http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition

【讨论】:

我无法让它工作。它不断将0000-00-00 00:00 放入数据库中。续集 6 w/mysql 5.7 看起来 sequelize 6 已更改为使用稍微不同的语法:DataTypes.DATE 和 DataTypes.NOW 用于值。 sequelize.org/master/manual/model-basics.html#dates 不知道是不是这个问题,但似乎sequelize 6 中有一些相关的变化。 我也试过了,但没有运气。只有 alucic 的答案对我有用。【参考方案3】:

在我的情况下,我创建如下模型

module.exports = (sequelize, type) => 
    return sequelize.define('blog', 
        blogId: 
          type: type.INTEGER,
          primaryKey: true,
          autoIncrement: true
        ,
        text: type.STRING,
        createdAt:
            type: 'TIMESTAMP',
            defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
            allowNull: false
        ,
        updatedAt:
            type: 'TIMESTAMP',
            defaultValue: sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
            allowNull: false
        
    )

【讨论】:

【参考方案4】:

您也可以使用时刻来创建时间戳:

const moment = require('moment-timezone');

    createdAt: 
      type: DataTypes.NOW,
      allowNull: false,
      defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
      field: 'createdAt'
    ,

【讨论】:

【参考方案5】:

而不是

 type: DataTypes.DATE,

使用下面的代码

      createdAt: 
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      ,
      updatedAt: 
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      ,

【讨论】:

【参考方案6】:

我对 sqLite 所做的事情是用我为 TIMESTAMP 自定义的 sql 逻辑扩展了 DataTypes,它运行良好。我不是 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 做的就是在 timestampSqlFunc 函数中更改 SQL 类型生成,例如 defaultSql 变量将是 @987654322 @

【讨论】:

以上是关于sequelize.js TIMESTAMP 不是 DATETIME的主要内容,如果未能解决你的问题,请参考以下文章

sequelize.js 中的字母数字 ID

Sequelize.js 与非别名关联一起加入别名关联

如何在关联表Sequelize js中获取自定义字段

Sequelize.js 外键

获取由 sequelize.js 生成的原始查询 [重复]

如何安装 sequelize.js 二进制文件?