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