Как использовать выполнить выбор таблицы под схемой в базе данных postgres? - PullRequest
1 голос
/ 30 марта 2019

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

[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

как мы можем ссылаться на имя схемы в exec-функции libpq ++?

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

мой код:

   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 &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
}

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

1 Ответ

1 голос
/ 30 марта 2019

База данных успешно открыта: ETBDB ОШИБКА: отношение "etb_reference.etb_member" не существует ЛИНИЯ 1: ВЫБРАТЬ * ОТ etb_reference.ETB_MEMBER

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

SELECT * FROM etb_reference. "ETB_MEMBER"

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

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

...