即使在使用 'IF EXISTS-THEN' pgsql 块时如何修复 "relation <table_name> does not exist" 错误?

How to fix "relation <table_name> does not exist" ERROR even when using 'IF EXISTS-THEN' pgsql block?

我们正在使用带有 Spring-Boot .sql 文件的 Postgres 13.0 版本作为初始步骤。

我需要 运行 更新脚本,但前提是 table 本身已经存在。

在努力理解什么是正确的语法之后,我使用了以下脚本:

ALTER TABLE IF EXISTS ONLY scm_repos ADD COLUMN IF NOT EXISTS token_id BIGINT;
DO '
    BEGIN
        IF EXISTS
            (SELECT 1 FROM scm_repos WHERE id = 1)
        THEN
            UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
        END IF ;
    END;
' ;

我的意图很简单 - 仅当 scm_repos table 确实存在时才 运行 UPDATE 脚本,但无论我尝试什么,我仍然收到以下错误:

Failed to execute SQL script statement #5 of URL [jar:file:/app/cx-integrations-datastore.jar!/BOOT-INF/classes!/schema.sql]: DO '
    BEGIN
        IF EXISTS
            (SELECT 1 FROM scm_repos WHERE id = 1)
        THEN
            UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
        END IF ;
    END;
' ; nested exception is org.********ql.util.PSQLException: ERROR: relation "scm_repos" does not exist
  Where: PL/pgSQL function inline_code_block line 3 at IF

我在这里错过了什么?

13.0 有已知的未修复错误。 13.4 是 13 的最新版本。运行 旧的次要版本几乎没有充分的理由。这似乎与这里无关。

但是您在这里缺少的是,在顶层,EXISTS 检查是否有 SELECT returns 任何行。它不检查 SELECT 的 FROM 列表中提到的 table 是否存在,它假设它们存在。

您可以更改查询,使其查询目录以查看 table 是否存在,例如:

IF EXISTS 
    (SELECT 1 FROM pg_class where relname=$J$scm_repos$J$)
...