Sequelize 中如何实现时间字段的自动更新

阅读时长 4 分钟读完

在使用 Sequelize 进行数据库操作时,经常会遇到需要对时间字段进行自动更新的情况,比如记录创建时间和更新时间。本文将介绍如何利用 Sequelize 实现时间字段的自动更新,并提供示例代码供参考。

1. 创建模型

首先,需要创建一个 Sequelize 模型,包含需要自动更新的时间字段。假设我们要创建一个用户表,包含创建时间和更新时间两个字段,可以按照以下方式定义模型:

-- -------------------- ---- -------
----- - ---------- --------- - - ---------------------
----- --------- - --- --------------------- ----------- ----------- -
  ----- ------------
  -------- -------
---

----- ---- - ------------------------ -
  ----- -----------------
  ------ -----------------
  ---------- -
    ----- ---------------
    ------------- --------------------------------------
  --
  ---------- -
    ----- ---------------
    ------------- --------------------------------------
  -
---

在上面的代码中,我们使用 Sequelize 定义了一个名为 User 的模型,包含 name、email、createdAt 和 updatedAt 四个字段。其中,createdAt 和 updatedAt 字段都是 DATE 类型,且设置了 defaultValue 为 Sequelize.literal('CURRENT_TIMESTAMP'),表示默认值为当前时间。

2. 配置钩子函数

接下来,需要为模型配置钩子函数,用于在创建或更新记录时自动更新时间字段。Sequelize 提供了 beforeCreate 和 beforeUpdate 两个钩子函数,分别在创建和更新记录之前执行。可以按照以下方式定义钩子函数:

在上面的代码中,我们为 User 模型定义了 beforeCreate 和 beforeUpdate 两个钩子函数。在 beforeCreate 钩子函数中,我们将 createdAt 和 updatedAt 字段的值都设置为当前时间;在 beforeUpdate 钩子函数中,我们将 updatedAt 字段的值设置为当前时间。

3. 测试代码

最后,我们可以编写测试代码,验证时间字段的自动更新是否生效。可以按照以下方式编写测试代码:

-- -------------------- ---- -------
------ -- -- -
  ----- ---------------- ------ ---- --- -- ----------
  ----- ------------- ----- -------- ------ ------------------- ---
  --- ---- - ----- -------------- ------ - ----- ------- - ---
  --------------------------- ---------------- -- -----------
  ---------- - ------------------------
  ----- ------------ -- ----
  ---- - ----- -------------- ------ - ----- ------- - ---
  --------------------------- ---------------- -- -----------
-----

在上面的测试代码中,我们先调用 sequelize.sync({ force: true }) 清空数据表并重新创建,然后创建一个名为 Alice 的用户记录,并输出其创建时间和更新时间。接着,我们更新 Alice 用户的邮箱,并保存记录,再次输出其创建时间和更新时间。运行测试代码后,可以看到输出的时间字段已经自动更新。

4. 总结

通过以上步骤,我们成功地利用 Sequelize 实现了时间字段的自动更新。在实际开发中,可以根据需要定义自己的模型和钩子函数,以实现更加灵活和高效的数据库操作。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6513c3b995b1f8cacdc31504

纠错
反馈