运行简单查询时Prisma准备好的语句错误

问题描述 投票:0回答:1

语言:节点 数据库:MySQL ORM:棱镜

我在 prisma 中运行此查询时遇到问题。我的数据库目前包含大约 100 000 本书。运行此命令时出现错误:

查询执行过程中出现错误: ConnectorError(ConnectorError { user_faceing_error: None, kind: QueryError(Server(ServerError { code: 1390, message: “准备好的语句包含太多占位符”,状态:“HY000” })),瞬态: false })

let books = await prisma.book.findMany({
    include: {
        authors: true,
    },
});

当我尝试在书中添加其他内容(例如出版物)时,它会起作用。只是作者,与出版物相比,作者并不多。顺便说一句,作者中只有一个属性fullname

如有任何建议,我们将不胜感激!

mysql node.js prepared-statement prisma
1个回答
0
投票

MySQL 在给定查询中具有 216-1 个参数的硬限制。

参考:https://github.com/mysql/mysql-server/blob/trunk/sql/sql_prepare.cc#L1502-L1506

if (stmt->m_param_count > static_cast<uint>(UINT_MAX16)) {
  /* Error code to be defined in 5.0 */
  my_error(ER_PS_MANY_PARAM, MYF(0));
  return true;
}

ER_PS_MANY_PARAM
是您收到的错误消息。

但是为什么你所谓的简单 Prisma 查询会超出这个限制?

我不是 Prisma 用户,但我猜测它在做什么。似乎当您使用

include
时它会生成两个查询。首先,它从 book 表中收集
all
行,每行都有一个作者 ID 引用。然后,它会生成第二个查询(例如
SELECT * FROM authors WHERE id IN (?, ?, ?, ?, ...)
),并传递 100000 本书的 all 行中的作者 ID。当然有很多重复项,但 Prisma 并没有费心去减少列表。

我做了一些搜索,发现 Prisma 不支持真正的连接。它使用附加查询收集相关行。

https://github.com/prisma/prisma/issues/5184

目前还没有办法将表连接在一起。包含关系的查询仅通过使用单独的查询来包含关系数据。

...

它只会使 Prisma 无法用于大量使用,尤其是在有大量连接的情况下。

(截至 2023 年 11 月问题尚未解决)

我认为对于你的情况,对于连接查询来说,如果外部查询中的行数可能很大,就忘记使用

include

最好的解决方法是直接使用原始 SQL 查询,并使用

JOIN
语法编写查询。请参阅 https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access 了解文档。

© www.soinside.com 2019 - 2024. All rights reserved.