Неопределенная таблица: 7 ОШИБКА: отношение "V5TableName" не существует - PullRequest
0 голосов
/ 22 апреля 2020

Я использую MVC framework (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;
}

Когда мое приложение вызывает эту функцию, оно возвращает следующую ошибку в моем logs:

[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. Добавление схемы в качестве префикса к имени таблицы (пример: 'public."V5TableName"').

Ничто из перечисленного не работает. Я не уверен, что здесь происходит не так.

Я также попытался определить общий размер базы данных в моем приложении (имя БД: 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

Мне было интересно, можно ли что-то подобное сделать, чтобы найти размер таблицы.

1 Ответ

0 голосов
/ 23 апреля 2020

Ваш запрос должен работать. Использование двойных кавычек кажется правильным.

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

Первая загадка должна быть решена на этом этапе.

Проверьте правильность написания вашей БД и возможные близкие дубликаты с помощью:

SELECT datname FROM pg_database;

Вызов без двойных кавычек (как вы пробовали правильно), но требует правильной капитализации:

SELECT pg_size_pretty(pg_database_size('MyDbName'));

Обратите внимание на небольшую разницу (как документально подтверждено в руководстве ):

  • pg_database_size() занимает oid или name. Поэтому передайте регистрозависимое имя базы данных без двойных кавычек .
  • pg_total_relation_size() занимает regclass , Поэтому передайте регистрозависимое имя отношения с двойными кавычками , если вам нужно сохранить заглавные буквы.

pg_database_size() должно отличаться, потому что нет тип идентификатора выделенного объекта для баз данных ( нет regdatabase).

Суть этого: избегать двойных кавычек в Postgres, если это возможно. Это делает вашу жизнь проще.

...