未定义表。7错误:关系 "V5TableName "不存在。

问题描述 投票:0回答:1

我正在使用一个MVC框架(Zend)做我的应用程序,我想找到PostgreSQL中一个表的总大小(包括索引)。表的名字是 "V5TableName" - 包括引号,因为表名是区分大小写的。我已经确保不涉及任何错别字。

我获取表大小的代码如下所示。

public function getMyTableSize()
{
  $sql = "SELECT pg_size_pretty(pg_total_relation_size( '\"V5TableName\"' ) );";

  /* Custom_Db is a custom library in my application which makes the PostgreSQL connection 
     and queries the database
   */
  $tableSize = Custom_Db::query($sql)->fetchColumn(); 

  return $tableSize;
}

当我的应用程序调用这个函数时,它在我的日志中返回以下错误。

[22-Apr-2020 09:42:37] PID:30849 ERR: SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "V5TableName" does not exist
LINE 1: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName...
                                                      ^
query was: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName"' ) );

如果我在pgAdmin4中运行同样的查询,它完全可以正常运行,返回表的大小(例如:104Mb)。

我已经尝试过。

  1. 在代码中去掉表名的引号并加上引号。
  2. 在表名后添加模式作为前缀(例如:104Mb)。'public."V5TableName"').

以上这些似乎都不奏效。我不知道这边到底出了什么问题。

我还试着在我的应用程序中找到数据库的总大小(db名。MyDbName - 混合大小写),我的查询看起来像下面的东西。

$sql = "SELECT pg_size_pretty(pg_database_size('MyDbName'))"; // this DID NOT WORK

所以我把它改成了下图所示的样子: (成功了)

$sql = "SELECT pg_size_pretty(pg_database_size( current_database() ))"; // this WORKED

我想知道是否有类似的东西可以用来查找表的大小。

php postgresql zend-framework zend-db pgadmin-4
1个回答
0
投票

你的查询 工作。使用双引号似乎是正确的。

SELECT pg_size_pretty(pg_total_relation_size('"V5TableName"'));

首先确保你连接到的是 正确的数据库群 (也就是 "服务器")。它由它的数据目录定义,或者同样毫不含糊地由主机名和端口号定义。阅读手册 此处此处.

然后确保你连接到 正确的数据库 在该数据库集群内。一个Postgres数据库集群由1-n个数据库组成。当不指定实际数据库而进行连接时,最终会在维护数据库中找到名为 postgres 默认情况下。这是最可能的解释。检查与。

SELECT current_database();

然后检查 右表和模式名:

SELECT * FROM pg_tables
WHERE tablename ~* 'V5TableName';  -- ~* matches case-insensitive

第一条谜语应该在此时被解开。

检查你的DB拼写和可能的近似重复。

SELECT datname FROM pg_database;

这个电话是 双引号(就像你试过的那样正确),但需要正确的大写。

SELECT pg_size_pretty(pg_database_size('MyDbName'));

请注意微妙的区别 (如上所述 在手册中):

  • pg_database_size() 需要 oidname. 所以要传递区分大小写的数据库名称。无双引号.
  • pg_total_relation_size() 需要 regclass. 所以传递大小写敏感的关系名为 加双引号 如果你需要保留大写。

pg_database_size() 必须有所不同,因为没有专门的数据库对象标识符类型(没有 regdatabase).

它的要点是:如果可能的话,在Postgres中避免使用双引号标识符。这能让你的生活更轻松。

© www.soinside.com 2019 - 2024. All rights reserved.