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

Can't query for more than 100 IDs with PostgreSQL

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

PG::TooManyArguments: ERROR: cannot pass more than 100 arguments to a function

当 运行 这样查询时:

 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。

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

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

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