PostgreSQL Schema下表查询及libpq++引用Schema报错解决
解决libpq++中引用带Schema的PostgreSQL表的问题
你遇到的核心问题其实是PostgreSQL对标识符大小写的处理规则,再加上C++字符串中转义双引号的正确用法,我们一步步来搞定:
问题根源
PostgreSQL默认会把未用双引号包裹的标识符(表名、Schema名)自动转换为小写。你收到的错误提示里显示relation "etb_reference.etb_member" does not exist,但你实际要访问的是etb_reference.ETB_MEMBER(大写表名)——这就是找不到表的关键:数据库里的表名是大写的,但你的SQL语句没加引号,被PostgreSQL转成小写去匹配了,自然找不到对应表。
正确的解决方式
在SQL语句中,用双引号包裹大小写敏感的Schema名和表名,同时在C++字符串里要把双引号转义(用\")。修改你的exec语句如下:
result res = wrk.exec("SELECT * FROM \"etb_reference\".\"ETB_MEMBER\"");
这样PostgreSQL就能准确识别到你要访问的Schema和表了。
为什么你之前的转义没用?
你尝试的'、\等转义方式都没命中要点:
- 单引号
'是用来包裹字符串常量的,不是标识符; - 单独的反斜杠在C字符串里是转义符,但你需要转义的是双引号,所以必须写成
\"才能让C把双引号正确传递给PostgreSQL。
额外建议
如果你的Schema名和表名都是小写的,其实不需要加双引号——但既然你用了大写的表名,就必须用双引号来保留大小写格式,这是PostgreSQL的硬性规则。
修改后的完整代码片段(关键部分已更新):
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); // 这里是修改后的SQL语句 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; }
内容的提问来源于stack exchange,提问作者ramesh.metta
相关产品推荐
相关产品推荐

