Как использовать выполнение выбора для таблицы в соответствии со схемой в базе данных postgres?

#postgresql #c 11 #centos7 #libpqxx

#postgresql #c 11 #centos7 #libpqxx

Вопрос:

Я пытаюсь выполнить операцию выбора в таблице postgres DB, и я получаю сообщение об ошибке ниже:

 [etb@centos etbtest]$ ./a.out

Opened database successfully: ETBDB
ERROR:  relation "etb_reference.etb_member" does not exist
LINE 1: SELECT * FROM etb_reference.ETB_MEMBER
  

как мы ссылаемся на имя схемы в функции libpq exec?

Я попытался экранировать имя схемы с помощью других параметров escape, таких как " , ' и т.д., Но это не помогло.

мой код :

    try {
      connection C("dbname = ETBDB user = etbadm password = etbtest 
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }

       work wrk(C);

   result res = wrk.exec("SELECT * FROM etb_reference.ETB_MEMBER");

   for (
      pqxx::result::const_iterator row = res.begin();
      row != res.end();
        row)
    {

     std::cout
        << row["MEMBER_ID"].as<int>() << "t"
        << row["SYS_CRE_DATE"].as<std::string>() << "t"
        << row["SYS_UPD_DATE"].as<std::string>() << "t"
        << row["MEMBER_CS"].as<std::string>() << "t"
        << row["MEMBER_TD"].as<std::string>() << "t"
        << row["MEMBER_ASD"].as<std::string>() << "t"
        << row["MEMBER_ITM"].as<std::string>() << "t"
        << std::endl;

    }
C.disconnect ();
 return 0;

   } catch (const std::exception amp;e) {
      cerr << e.what() << std::endl;
      return 1;
   }
}
  

Я могу выполнить set search_path to 'schema' , но я разделил базу данных на схемы, такие как таблицы приложений, справочные таблицы, таблицы конфигурации, для упрощения управления переносом и поддержкой с помощью автоматизированной оболочки и скриптов db.

Комментарии:

1. Что такое ‘etb_reference. ETB_MEMBER’? Это должно быть имя таблицы в базе данных ETBDB.

2. Привет, спасибо за ответ. etb_reference — это имя схемы, а ETB_MEMBER — таблица под схемой. Кроме того, я предоставил полные права доступа к схеме и таблице пользователю, к которому я подключен через код c . когда я запускаю этот запрос в psql: ВЫБЕРИТЕ * ИЗ etb_reference.»ETB_MEMBER» , я получаю результат для того же пользователя.

3. Хватаясь за соломинку, поэтому несколько глупых предложений: дважды проверьте правильность написания; добавьте точку с запятой; в конце инструкции SQL таким образом: «ВЫБЕРИТЕ * ИЗ etb_reference. ETB_MEMBER;»; попробуйте инструкцию SQL из pgAdmin или командной строки; задайте путь поиска к схеме через PQexec()

Ответ №1:

База данных успешно открыта: ОШИБКА ETBDB: отношение «etb_reference.etb_member» не существует СТРОКА 1: ВЫБЕРИТЕ * ИЗ etb_reference.ETB_MEMBER

Сообщение об ошибке содержит название таблицы в нижнем регистре. Он также выводит строку, в которой возникает ошибка, и эта строка содержит название таблицы в верхнем регистре.

ВЫБЕРИТЕ * ИЗ etb_reference.»ETB_MEMBER»

При выполнении запроса вручную вы используете верхний регистр и помещаете имя таблицы в двойные кавычки.

PostgreSQL по умолчанию работает со строчными буквами, если только имя не заключено в двойные кавычки, поэтому, чтобы устранить проблему, просто поместите имя таблицы в двойные кавычки в запросе (или, что лучше, используйте только имена в нижнем регистре)