如何使默认时间戳列表现出来?

时间:2015-02-12 22:10:13

标签: node.js postgresql orm sequelize.js

我试图强制这些列做两件事:

  1. 使用“没有时区的时间戳”(后端是Postgres)。
  2. 实际上将后端的默认值设置为“now / utc”。

        {
            // a bunch of column definitions
            createdAt: { type: DataTypes.DATE, defaultValue: sequelize.fn('now') }
        }, 
        {
            timestamps: false,
            comment: "this isn't even the real comment"
        }
    
  3. 结果如下:

    CREATE TABLE IF NOT EXISTS "common"."images" ("id" VARCHAR(255) , "imageType"
    VARCHAR(255), "mimeType" TEXT, "source" VARCHAR(255), "path" TEXT UNIQUE, 
    "createdAt" TIMESTAMP WITH TIME ZONE DEFAULT now(), PRIMARY KEY ("id")); 
    COMMENT ON TABLE "common"."images" IS 'blah blah blah.';
    

    但是,我找不到任何关于如何强制将其设为timestamp-without-tz的文档,或者我如何在时区'utc'处设置默认的“now()”。

    这些都可能吗?

    如果可能,可以不将时间戳设置为false并按照我的方式手动定义列来完成吗?

3 个答案:

答案 0 :(得分:2)

显然,对于这个问题的后半部分,有一个相当优雅的解决方案。 Sequelize提供了一种“文字”方法,允许您(除其他外)完全按照您的意愿制作默认值。

{
    // a bunch of column definitions
    createdAt: { type: DataTypes.DATE, defaultValue: sequelize.literal("(now() at time zone 'utc')") }
}, 

我用双引号括起来,因为Postgres希望在后端的“utc”周围加上单引号。

当然,Yuri是正确的,因为Sequelize中没有“没有时区”的数据类型,也没有任何以这种方式配置数据类型的选项。我知道这里不鼓励部分答案,但认为这可能有助于其他人。

答案 1 :(得分:1)

设置续集实例时,可以将options.timezone设置为UTC,设置所有续集连接的时区,这意味着每个NOW()调用都是UTC。这也适用于默认时间戳。请参阅文档:http://sequelize.readthedocs.org/en/latest/api/sequelize/

或者,您可以修改postgresql.conf并在那里默认时区。

答案 2 :(得分:0)

您可以使用力矩库来创建时间戳:

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

此外,您可以在模型配置中将时间戳记设置为true,以便在数据库中创建行时自动更新时间戳记。

  const orderDetails = sequelize.define('orderDetails', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    itemId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: 'item_id'
    }
    quantity: {
      type: DataTypes.FLOAT,
      allowNull: false,
      field: 'quantity'
    },
    itemDescription: {
      type: DataTypes.STRING(128),
      allowNull: false,
      defaultValue: ' ',
      field: 'item_desc'
    },
    createdAt: {
      type: DataTypes.NOW,
      allowNull: false,
      defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
      field: 'createdAt'
    },
    updatedAt: {
      type: DataTypes.NOW,
      allowNull: false,
      defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
      field: 'updatedAt'
    },
  }, {
    tableName: 'order_details',
    timestamps: true,
  });