Node.js 使用 Sequelize 连接 MySQL 数据库遇到的坑

前言

Node.js 已经成为了现代 Web 开发的重要技术,而 Sequelize 是一个优秀的 ORM (Object-Relational Mapping)框架,可以帮助我们更便捷地操作数据库。在使用 Sequelize 连接 MySQL 数据库时,很多人都会遇到一些坑,本文将会详细介绍。

Sequelize 的基本用法

在使用 Sequelize 前,我们需要先安装它:

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

安装完成后,我们需要进行一系列的配置,包括数据库的地址、用户名、密码等。在这里我们以连接本地的 MySQL 数据库为例:

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

其中,dialect 表示要连接的数据库类型,这里我们使用的是 MySQL 数据库;hostportusernamepassworddatabase 分别表示数据库所在的服务器地址、端口号、用户名、密码、数据库名称。

连接成功后,我们就可以通过 Sequelize 进行增删改查等操作了。下面是一个简单的示例代码:

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

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

在这个例子中,我们首先定义了一个 User 模型,包含了 usernamepassword 两个属性;然后通过 sequelize.sync 方法将模型同步到数据库中;最后创建了一个 User 对象,插入到数据库中,并打印出了插入后的结果。

Sequelize 连接 MySQL 数据库的坑

1. 数据库的字符集

默认情况下,Sequelize 连接 MySQL 数据库时会将字符集设置为 utf8mb4,这对于大多数情况下都是没有问题的,但是当我们需要存储一些特殊字符时,就可能会出现问题。比如,当我们要存储 Emoji 表情时,如果数据库字符集不支持,就会出现乱码。

解决方法非常简单,只需要在连接数据库时设置字符集即可:

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

在上面的代码中,我们通过 dialectOptions 设置了字符集为 utf8mb4

2. 时间字段的默认值

在 MySQL 数据库中,如果一个字段使用了 timestamp 类型,但是没有指定默认值,则默认会使用 CURRENT_TIMESTAMP 作为默认值。但是在使用 Sequelize 时,如果我们没有指定默认值,Sequelize 就会自动将该字段的默认值设置为当前时间。

这在大多数情况下都是没有问题的,但是如果我们需要将默认值设置为 CURRENT_TIMESTAMP,就需要使用 Sequelize.literal 方法。下面是一个示例:

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

在上面的代码中,我们指定了 createdAt 字段的默认值为 CURRENT_TIMESTAMP

3. TimeZone 的问题

在 MySQL 中,timestamp 类型的字段是没有时区信息的,但是在 Sequelize 中,为了让开发者更便捷地操作时间,它默认使用了 UTC 时区。这在大多数情况下都是没有问题的,但是如果应用涉及到了时区的问题,就需要格外注意。

解决方法非常简单,只需要在连接数据库时设置时区即可:

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

在上面的代码中,我们通过 timezone 设置时区为 +08:00

总结

本文介绍了使用 Sequelize 连接 MySQL 数据库时可能会遇到的坑,包括字符集、时间字段的默认值和 TimeZone 的问题。这些坑有些是很细节的问题,但是如果不注意就会出现一些奇怪的 bug,给我们带来麻烦。掌握了这些坑,我们就可以更加高效地使用 Sequelize 进行数据库操作。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66467b2cd3423812e4497c15