Node.js 如何使默认时间戳列正常工作?

Node.js 如何使默认时间戳列正常工作?,node.js,postgresql,orm,sequelize.js,Node.js,Postgresql,Orm,Sequelize.js,我试图迫使这些专栏做两件事: 使用“没有时区的时间戳”(后端为Postgres) 实际上,在后端将默认值设置为“now/utc” 结果如下: CREATE TABLE IF NOT EXISTS "common"."images" ("id" VARCHAR(255) , "imageType" VARCHAR(255), "mimeType" TEXT, "source" VARCHAR(255), "path" TEXT UNIQUE, "createdAt" TIMESTAMP WIT

我试图迫使这些专栏做两件事:

  • 使用“没有时区的时间戳”(后端为Postgres)
  • 实际上,在后端将默认值设置为“now/utc”

  • 结果如下:

    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并像我所做的那样手动定义列的情况下完成此操作?

    设置sequelize实例时,可以将options.timezone设置为UTC,它为所有sequelize连接设置时区,这意味着每次NOW()调用都将使用UTC。这也适用于默认时间戳。见文件:


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

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

    {
        // a bunch of column definitions
        createdAt: { type: DataTypes.DATE, defaultValue: sequelize.literal("(now() at time zone 'utc')") }
    }, 
    
    我把它用双引号括起来,因为Postgres希望在后端的“utc”周围用单引号括起来


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

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

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

    谢谢,我想我知道在哪里做。。。你知道如何强制时间戳类型为“无时区”吗?我不认为有办法做到这一点。以下是可用的Sequelize数据类型,我在列表中没有看到“无时区”时间戳类型。
      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,
      });