Skip to content

PostgREST error: 400 'column example_table.example_column does not exist' when using OR operators

Last edited: 8/12/2026

如果你在变更请求(PATCHPOSTDELETE)中收到带有信息 column example_table.example_column does not exist400 错误——而对同一列的 SELECT 查询完全正常——这是 PostgREST 14.4 以前版本中的一个已知 bug(issue #3707)。

🌐 If you receive a 400 error with the message column example_table.example_column does not exist only on mutation requests (PATCH, POST, DELETE) — while SELECT queries on the same column work fine — this is a known bug in PostgREST versions before 14.4 (issue #3707).

根本原因 #

🌐 Root cause

当在一个 mutation 请求中包含 or() 过滤器时,会触发这个 bug。PostgREST 错误地将 OR 过滤器的列解析逻辑应用到 mutation 计划上,导致它无法找到本来存在且可以访问的列。

🌐 The bug is triggered when an or() filter is included in a mutation request. PostgREST incorrectly applies the OR filter's column resolution logic to the mutation plan, causing it to fail to locate columns that exist and are otherwise accessible.

怎么确认 #

🌐 How to confirm

  1. 重现不对称 — 使用 GET 请求运行相同的过滤器。如果成功,但 PATCH/POST/DELETE 在相同的列引用下失败,这个 bug 很可能就是原因。
  2. 检查你的 PostgREST 版本 — 进入 项目设置 > 基础设施 查看 Postgres 版本。PostgREST 14.1 及更早版本受到影响;14.4+ 已包含修复。
  3. 检查 Postgres 日志 — 如果你启用了日志记录,你应该能看到与失败变更请求的时间戳对应的 column "example_column" does not exist 错误。

分辨率 #

🌐 Resolution

选项 1:升级(永久修复) #

🌐 Option 1: Upgrade (permanent fix)

导航到 项目设置 > 基础设施 并升级到最新的 Postgres 版本。这会自动将 PostgREST 升级到 14.5+,其中的漏洞已经修复。

🌐 Navigate to Project Settings > Infrastructure and upgrade to the latest Postgres version. This automatically upgrades PostgREST to 14.5+, where the bug is resolved.

选项 2:查询变通方法(立即) #

🌐 Option 2: Query workaround (immediate)

在你的变更请求的 select 参数中明确包含错误中提到的列。这会强制 PostgREST 在执行变更计划时正确解析该列。

🌐 Explicitly include the column referenced in the error in the select parameter of your mutation request. This forces PostgREST to resolve the column correctly during the mutation plan.

例如,如果你的请求看起来像这样:

🌐 For example, if your request looks like:

1
PATCH /rest/v1/example_table?or=(example_column.eq.value1,example_column.eq.value2)

在受影响的列中添加 select=

🌐 Add select= with the affected column:

1
PATCH /rest/v1/example_table?or=(example_column.eq.value1,example_column.eq.value2)&select=id,example_column

这个解决方法是按每次请求应用的,不需要更改任何架构或基础设施。

🌐 This workaround applies per-request and does not require any schema changes or infrastructure modifications.