Sequelize 踩坑记录

Sequelize 注释版入门代码样例:https://github.com/kasora/fakeCode/tree/master/sequelize

目录

  1. 查询 join 进来的字段
  2. is not associated with 问题
  3. 同时使用 GROUP BY、DISTINCT 和 COUNT 的 BUG
  4. 利用某一字段更新另一字段
  5. 以 join 进来的字段进行排序

约定规范。

sequelize 提供了很多顶级方法。一般格式为 sequelize.xxx() 其中的 sequelize 指代 new Sequelize 时生成的对象。


———-2017/08/18———-

在查询中如果需要检索 include 引入的新表中的字段时,使用’$includedTable.fieldName$’来检索。

例如

 


———-2017/08/21———-
is not associated with 问题。常见于查询并使用 include 的情况。

例如:

(node:96247) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: tablea (tablea) is not associated to tableb!

该问题是由于定义连接时别名与 include 时别名不同。

解决方案:

  • 在 belongsTo (或其他设置连接函数)与 include 时的 as 参数填写相同的别名。
  • 在 belongsTo (或其他设置连接函数)与 include 时均不添加 as 参数。

参考:https://itbilu.com/nodejs/npm/41dDJj7n-.html


———-2017/08/30———-

同时使用 GROUP BY、DISTINCT 和 COUNT 时返回值为 Promise<integer> 而不是 Promise<Array<KeyValuePair<field , integer>>>

以下为样例代码:

该问题目前暂时原因未知,暂时的解决方案是使用 sequelize.query 直接手动拼接 SQL 来解决

已发 issue,不过。。可能是我英语水平太差写的东西官方看不懂。。所以暂时没有回应。如有回应。会更新本条消息。


———-2017/09/02———-

利用同一记录中的某一字段更新另一字段。

例如在 sql 语句中存在这样的写法

但是 sequelize 中如果你写成

这样的形式的话,sequelize 会尝试将 a 与 b 作为 js 的变量进行解析。当然就报错了。

在官方的 issue 中发现有一个顶级方法 sequelize.col 该方法允许传入一个字符串,来指定引入该字段的值。例如

但是如果你尝试对该方法引入的字段进行修改的话,最终就会生成一个 NaN。所以,这个顶级函数实际上只会被用在 where 等查询语句中。

最终在文档中发现了另一个顶级方法 sequelize.literal。

该方法的作用就是,写入一段不会经过转译的字符串作为参数。最终曲线救国。


———-2017/11/29———-

业务逻辑中,我们经常会使用 tableA include tableB,如果后续的业务需要对结果集以 tableB 中的字段为基准进行排序对 sequelize 来说就是一个很怪异的操作。

实现代码如下:

当然如果没有设置 model 的 as 属性就可以写的简单一些

同时,如果你是嵌套 include 的话,可以写成

这时的 order by 字段则会使用 tableB.tableC.fieldName。


———-2018/10/25———-

model 同步的时候需要注意先后顺序。顺序应该为

  1. model 定义
  2. 添加 model 间的关系
  3. model sync

model 不定义则关系没法添加,而添加关系的方法是同步的,也就是说所有的关系都会留到 sync 的时候反馈给数据库。

顺序关系在使用 through 创建中间表和允许 sequelize 修改表结构时相当重要。

但是如果你手动维护数据库关系,那么优先同步 model,再添加关系可以提高加载速度。

发表评论

电子邮件地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.