【问题标题】:What causes error "relation "table_name" does not exist" and how can I fix it?是什么导致错误“关系“table_name”不存在”,我该如何解决?
【发布时间】:2021-11-23 03:50:40
【问题描述】:

我知道之前有人问过这个问题,但没有一个建议的解决方案对我有用。

我有以下简单的查询:

UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id)

在我的 PostgreSQL 上本地运行此查询时,它可以按预期工作,但是当它在远程 PostgreSQL 上的“部署”阶段作为脚本运行时,它会失败并出现以下错误:

UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);嵌套异常是 org.********ql.util.PSQLException:错误:关系“scm_repos”确实 不存在

我尝试用双引号将表名括起来,并且我还确保该表与公共架构相关(我看到一些解决方案建议在不公开的情况下显式编写架构名称)。

我在这里缺少什么? 这是一个非常简单的任务,但我没有尝试过让它运行。

【问题讨论】:

    标签: java sql postgresql


    【解决方案1】:

    要么你连接到错误的数据库,要么参数search_path设置不同。

    做显而易见的事情并明确命名架构:

    UPDATE public.scm_repos SET ...
    

    【讨论】:

    • 感谢您的建议。我尝试在您编写时明确添加“公共”模式,并使用双引号(“public”。“scm_repos”),但仍然收到错误:ERROR: relation "public.scm_repos" does not exist。该表确实存在于远程数据库中。还有其他解决方案吗?
    • 那么该表确实不存在。就像我说的,你可能连接到了错误的数据库。
    • 你是对的。经过进一步调查,事实证明该表实际上不存在。我搜索了仅当表存在时才运行 UPDATE 查询的正确方法,但它们都没有真正起作用...运行此脚本的正确方法是什么?
    • 只需运行它,然后捕获并处理错误。这通常是最好的,因为它不受竞争条件的影响。
    【解决方案2】:

    Postgres 有点挑剔,这意味着有时您必须在连接中明确指定架构和数据库。因此,它在本地和远程机器上的行为可能不同。

    你可以做的是:

    1. 首先检查远程数据库的当前状态。您可以使用tools(例如DataGrip)轻松做到这一点。像往常一样指定远程连接。
    2. 在连接时定义它的架构。 IE。 jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema。更多信息here
    3. 或者,在查询中明确说明架构。 Laurenz Albe 的回答清楚地定义了这一点。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 2011-01-28
      • 1970-01-01
      • 2021-11-14
      • 2020-03-30
      • 2012-10-25
      • 2023-03-08
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多