【问题标题】:sequelize.js TIMESTAMP not DATETIMEsequelize.js TIMESTAMP 不是 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 列?

【问题讨论】:

    标签: mysql node.js datetime timestamp sequelize.js


    【解决方案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 @

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-10-05
              • 2021-09-18
              • 1970-01-01
              • 2014-03-13
              • 2017-01-25
              • 1970-01-01
              • 2020-12-15
              • 2022-01-02
              相关资源
              最近更新 更多