Sequelize、Postgresql 和 created/modified 时间戳管理
Sequelize, Postgresql, and created/modified timestamp management
我真的是 Sequelize 的新手,但我已经使用另一种语言的另一种 ORM 很长时间了。我试图弄清楚自动管理模型时间戳背后的神奇之处,我觉得我在兜圈子。
我 喜欢 的是让 Sequelize 管理知道何时为我更新“createdAt”和“modifiedAt”的工作。但是,我强烈希望它使用 statement_timestamp()
(主要是出于长期习惯和比我聪明得多的数据库人员的建议)。我不想像那些重要的东西依赖于客户端时钟。
我以前的 ORM 只维护了两个准备好的语句(根据 table),一个用于创建,一个用于更新,并且查询只是以正确的方式更新了正确的字段,因为它们是这样编码的。当然我可以写原始的 SQL 但这种做法违背了使用像 Sequelize 这样的东西的目的。
我发现 some material online 这似乎表明,如果我想做我正在谈论的事情,我只能靠自己,因为必须关闭 timestamps
模型。链接的 post 是关于 MySQL 的,它有一些技巧可以使它起作用。
我很想 post 编码,但这是先有鸡还是先有蛋的问题。哦,还有:我正在使用 运行 到 psql
的脚本手动创建我的模式。在脚本中,我定义了我多年来一直在做的列:
CREATE TABLE unit_type (
utyp_id serial NOT NULL PRIMARY KEY,
utyp_name varchar(32) NOT NULL,
utyp_description varchar(512) NOT NULL,
created timestamp without time zone NOT NULL DEFAULT statement_timestamp(),
modified timestamp without time zone NOT NULL DEFAULT statement_timestamp(),
version SMALLINT NOT NULL DEFAULT 0
);
(我不关心列名;“createdAt”就可以了。)我的旧 ORM 没有注意列默认值;时间戳是它的一个内在特征。 (它是自制的,所以它没有名字。但是它起作用了。)
我当前通过 Sequelize 编写的代码都可以正常工作,但我有兴趣解决真正的数据库问题,我只是不明白时间戳功能应该如何工作。
您可以用hooks
覆盖Sequelize的默认时间戳函数。
const sequelize = new Sequelize(
...
{
host: 'localhost',
port: 5432,
dialect: 'postgres',
hooks : {
beforeCreate : (record, options) => {
record.dataValues.createdAt = Sequelize.fn('statement_timestamp');
record.dataValues.updatedAt = Sequelize.fn('statement_timestamp');
},
beforeUpdate : (record, options) => {
record.dataValues.updatedAt = Sequelize.fn('statement_timestamp');
}
}
}
);
我真的是 Sequelize 的新手,但我已经使用另一种语言的另一种 ORM 很长时间了。我试图弄清楚自动管理模型时间戳背后的神奇之处,我觉得我在兜圈子。
我 喜欢 的是让 Sequelize 管理知道何时为我更新“createdAt”和“modifiedAt”的工作。但是,我强烈希望它使用 statement_timestamp()
(主要是出于长期习惯和比我聪明得多的数据库人员的建议)。我不想像那些重要的东西依赖于客户端时钟。
我以前的 ORM 只维护了两个准备好的语句(根据 table),一个用于创建,一个用于更新,并且查询只是以正确的方式更新了正确的字段,因为它们是这样编码的。当然我可以写原始的 SQL 但这种做法违背了使用像 Sequelize 这样的东西的目的。
我发现 some material online 这似乎表明,如果我想做我正在谈论的事情,我只能靠自己,因为必须关闭 timestamps
模型。链接的 post 是关于 MySQL 的,它有一些技巧可以使它起作用。
我很想 post 编码,但这是先有鸡还是先有蛋的问题。哦,还有:我正在使用 运行 到 psql
的脚本手动创建我的模式。在脚本中,我定义了我多年来一直在做的列:
CREATE TABLE unit_type (
utyp_id serial NOT NULL PRIMARY KEY,
utyp_name varchar(32) NOT NULL,
utyp_description varchar(512) NOT NULL,
created timestamp without time zone NOT NULL DEFAULT statement_timestamp(),
modified timestamp without time zone NOT NULL DEFAULT statement_timestamp(),
version SMALLINT NOT NULL DEFAULT 0
);
(我不关心列名;“createdAt”就可以了。)我的旧 ORM 没有注意列默认值;时间戳是它的一个内在特征。 (它是自制的,所以它没有名字。但是它起作用了。)
我当前通过 Sequelize 编写的代码都可以正常工作,但我有兴趣解决真正的数据库问题,我只是不明白时间戳功能应该如何工作。
您可以用hooks
覆盖Sequelize的默认时间戳函数。
const sequelize = new Sequelize(
...
{
host: 'localhost',
port: 5432,
dialect: 'postgres',
hooks : {
beforeCreate : (record, options) => {
record.dataValues.createdAt = Sequelize.fn('statement_timestamp');
record.dataValues.updatedAt = Sequelize.fn('statement_timestamp');
},
beforeUpdate : (record, options) => {
record.dataValues.updatedAt = Sequelize.fn('statement_timestamp');
}
}
}
);