【问题标题】:How do I make the default timestamp columns behave?如何使默认时间戳列的行为?
【发布时间】:2015-04-13 20:34:48
【问题描述】:

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

  1. 使用“timestamp without time zone”(后端是 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"
        }
    

结果是这样的:

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.';

但是,我找不到任何文档说明如何强制将其设置为不带 tz 的时间戳,或者如何在时区 'utc' 处设置默认值“now()”。

这些都可能吗?

如果可能,是否可以在不将时间戳设置为 false 并像我所做的那样手动定义列的情况下完成?

【问题讨论】:

    标签: node.js postgresql orm sequelize.js


    【解决方案1】:

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

        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,以便在您在 DB 中创建行时自动更新时间戳。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        或者,您可以修改您的 postgresql.conf 并在此处默认时区。

        【讨论】:

        • 谢谢,我想我知道在哪里做...知道如何强制时间戳类型为“无时区”吗?
        • 我认为没有办法做到这一点。以下是可用的 Sequelize 数据类型github.com/sequelize/sequelize/blob/master/lib/… 我在列表中没有看到“无时区”时间戳类型。
        猜你喜欢
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多