Undefined table: 7 ERROR: relation "V5TableName" does not exist
Undefined table: 7 ERROR: relation "V5TableName" does not exist
我正在为我的应用程序使用 MVC 框架 (Zend),我想在 PostgreSQL 中找到 table 的总大小(包括索引)。 table 名称是 "V5TableName" - 包含引号是因为 table 名称区分大小写。我已经确保没有错别字。
我获取 table 大小的代码如下所示:
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;
}
当我的应用程序调用此函数时 returns 我的日志中出现以下错误:
[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 中使用相同的查询,它可以很好地返回 table 大小(例如:104Mb)。
我试过:
- 在代码中为 table 名称删除和添加引号。
- 将架构作为前缀附加到 table 名称(示例:
'public."V5TableName"'
)。
NONE 以上似乎有效。我不确定这里出了什么问题。
我还尝试在我的应用程序中查找总数据库大小(数据库名称: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
我想知道是否有类似的方法可以找到 table 尺寸。
您的查询应该有效。双引号的使用似乎是正确的。
SELECT pg_size_pretty(pg_total_relation_size('"V5TableName"'));
首先确保您连接到正确的数据库集群 (a.k.a。"server")。它由其数据目录定义,或者同样由主机名和端口号定义。阅读手册 here and here。
然后确保您连接到该数据库集群中正确的数据库。一个 Postgres 数据库集群由 1-n 个数据库组成。在未指定实际数据库的情况下进行连接时,默认情况下您最终会进入名为 postgres
的维护数据库。这是最有可能的解释。检查:
SELECT current_database();
然后检查权限table和架构名称:
SELECT * FROM pg_tables
WHERE tablename ~* 'V5TableName'; -- ~* matches case-insensitive
至此第一个谜题应该解开了。
检查您的数据库拼写和可能的近似重复:
SELECT datname FROM pg_database;
调用 没有 双引号(就像您尝试正确一样),但需要正确的大写:
SELECT pg_size_pretty(pg_database_size('MyDbName'));
注意细微差别(如文档所述in the manual):
pg_database_size()
取 oid
或 name
。因此传递区分大小写的数据库名称 不带双引号.
pg_total_relation_size()
占用 regclass
。因此,如果需要保留大写,请传递区分大小写的关系名称 和双引号 。
pg_database_size()
必须有所不同,因为数据库没有专用的对象标识符类型 (no regdatabase
)。
要点:尽可能避免在 Postgres 中使用双引号标识符。它让您的生活更轻松。
我正在为我的应用程序使用 MVC 框架 (Zend),我想在 PostgreSQL 中找到 table 的总大小(包括索引)。 table 名称是 "V5TableName" - 包含引号是因为 table 名称区分大小写。我已经确保没有错别字。
我获取 table 大小的代码如下所示:
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;
}
当我的应用程序调用此函数时 returns 我的日志中出现以下错误:
[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 中使用相同的查询,它可以很好地返回 table 大小(例如:104Mb)。
我试过:
- 在代码中为 table 名称删除和添加引号。
- 将架构作为前缀附加到 table 名称(示例:
'public."V5TableName"'
)。
NONE 以上似乎有效。我不确定这里出了什么问题。
我还尝试在我的应用程序中查找总数据库大小(数据库名称: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
我想知道是否有类似的方法可以找到 table 尺寸。
您的查询应该有效。双引号的使用似乎是正确的。
SELECT pg_size_pretty(pg_total_relation_size('"V5TableName"'));
首先确保您连接到正确的数据库集群 (a.k.a。"server")。它由其数据目录定义,或者同样由主机名和端口号定义。阅读手册 here and here。
然后确保您连接到该数据库集群中正确的数据库。一个 Postgres 数据库集群由 1-n 个数据库组成。在未指定实际数据库的情况下进行连接时,默认情况下您最终会进入名为 postgres
的维护数据库。这是最有可能的解释。检查:
SELECT current_database();
然后检查权限table和架构名称:
SELECT * FROM pg_tables
WHERE tablename ~* 'V5TableName'; -- ~* matches case-insensitive
至此第一个谜题应该解开了。
检查您的数据库拼写和可能的近似重复:
SELECT datname FROM pg_database;
调用 没有 双引号(就像您尝试正确一样),但需要正确的大写:
SELECT pg_size_pretty(pg_database_size('MyDbName'));
注意细微差别(如文档所述in the manual):
pg_database_size()
取oid
或name
。因此传递区分大小写的数据库名称 不带双引号.pg_total_relation_size()
占用regclass
。因此,如果需要保留大写,请传递区分大小写的关系名称 和双引号 。
pg_database_size()
必须有所不同,因为数据库没有专用的对象标识符类型 (no )。regdatabase
要点:尽可能避免在 Postgres 中使用双引号标识符。它让您的生活更轻松。