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