如何在postgres数据库中的模式下的表上执行选择?

时间:2019-03-29 22:58:48

标签: 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函数中引用架构名称?

我尝试使用其他转义选项(例如"'\等)将模式名称转义,但这无济于事。

我的代码:

   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;
   }
}

我可以执行set search_path to 'schema',但是我已按数据库将模式划分为诸如应用程序表,参考表,配置表之类的模式,以便于通过自动Shell和db脚本轻松管理移植和维护。

1 个答案:

答案 0 :(得分:1)

  

成功打开数据库:ETBDB错误:关系   “ etb_reference.etb_member”不存在第1行:SELECT * FROM   etb_reference.ETB_MEMBER

错误消息包含小写的表名。它还会打印出发生错误的行,并且该行包含大写的表名。

  

SELECT * FROM etb_reference。“ ETB_MEMBER”

手动查询时,使用大写字母并将表名放在双引号之间。

PostgreSQL默认情况下使用小写,除非名称在双引号之间,所以要解决此问题,只需在查询中将表名放在双引号之间(或者,更好的是,仅使用小写名称)