提问人:Bohumil Miláček 提问时间:11/8/2023 更新时间:11/9/2023 访问量:32
运行简单查询时出现 Prisma prepared 语句错误
Prisma prepared statement error when running simple query
问:
Lang:节点 数据库:MySQL ORM:棱镜
我在 prisma 中运行此查询时遇到问题。我的数据库目前包含大约100 000本书。运行此命令时,出现错误:
查询执行期间发生错误: ConnectorError(ConnectorError { user_facing_error: None, kind: QueryError(Server(ServerError { code: 1390, message: “预准备语句包含过多的占位符”, state: “HY000” })), transient: false })
let books = await prisma.book.findMany({
include: {
authors: true,
},
});
当我尝试在书中包含其他内容(例如出版物)时,它会起作用。只是作者,与出版物相比,他们并不多。顺便说一句,作者中只有一个属性全名。
任何建议都值得赞赏!
答:
MySQL 在给定查询中具有 2个 16-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 用户,但我猜到了它在做什么。似乎当你使用它时会生成两个查询。首先,它收集表中的所有行,每行都有一个作者 ID 引用。然后,它会生成第二个查询,例如,并从 100000 本书的所有行中传递作者 ID。当然有很多重复项,但 Prisma 并不费心去减少列表。include
book
SELECT * FROM authors WHERE id IN (?, ?, ?, ?, ...)
我做了一些搜索,发现确认 Prisma 不支持真正的连接。它使用其他查询收集相关行。
https://github.com/prisma/prisma/issues/5184
目前,无法将表联接在一起。包含关系的查询仅包含使用单独查询的关系数据。
...
它只是使 Prisma 无法用于大量使用,尤其是在大量连接的情况下。
(截至 2023 年 11 月,问题未解决)
我认为就您的情况而言,对于联接查询,如果外部查询中的行数可能很大,则忘记使用。include
最好的解决方法是直接使用原始 SQL 查询,并编写查询以使用语法。有关文档,请参阅 https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access。JOIN
评论