无法使用 PostgreSQL 查询超过 100 个 ID

时间:2021-04-09 14:09:31

标签: ruby-on-rails postgresql activerecord

我正在从 MySQL 迁移到 PostgreSQL,但出现以下错误:

<块引用>

PG::TooManyArguments: 错误:不能将超过 100 个参数传递给函数

运行这样的查询时:

 Project.where(id: ids)

翻译成

"SELECT \"projects\".* FROM \"projects\" WHERE \"projects\".\"id\" IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100) ORDER BY FIELD(projects.id, '1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100')"

对我来说,按特定 ID 查询是一个常见用例,它与 MySQL 配合得很好。有什么办法可以使这个与 PostgreSQL 一起工作吗?

我在 docker 容器上使用 PostgreSQL 13.2。

2 个答案:

答案 0 :(得分:0)

根据您的错误,原因是函数而不是查询本身。您可以将 32K 参数传递给查询,它会起作用(2byte int 限制)。至于函数,postgres 默认有 100 个 arg 限制(在编译期间设置)。您可以尝试从源代码编译并将该数字设置为更高的值(我不建议这样做,除非您真的了解后果)。

最好的方法可能是研究如何替换执行和修改的 FIELD() 函数,以免遇到问题。您可以更改您的系统,以便您可以使用数据库中的列进行排序吗?这样您就不需要传递这些 ID 进行排序。或者,如果您必须使用 ID,那么使用 CASE 进行排序怎么样,就像在这个 SO 问题中一样:Simulating MySQL's ORDER BY FIELD() in Postgresql

答案 1 :(得分:-1)

我能找到的唯一“修复”是将 PostgreSQL docker 映像降级到 11.11,而不会发生此错误。

相关问题