本次主要介绍PostgreSQL C++接口libpqxx在ubuntu下环境配置并测试添加数据到主机windows下PostgreSQL数据库中。
1、打开ubuntu终端,执行命令sudo apt install libpqxx-dev 安装libpqxx-dev
2、打开安装的pqxx文件,依次执行以下命令
ls /usr/include/ ls /usr/include/pqxx ls /usr/include/pqxx/pqxx
3、回到主机下,在安装好的PostgreSQL的安装目录下,找到data文件夹下pg_hba.conf文件,先拷贝一个副本作为备用,
再打开该文件(可用记事本打开),找到最下面的IPV4 修改IP为0.0.0.0/0
0.0.0.0/0表示所有的IP地址.它表示的是这样一个集合:
1)所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。
2)对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一 律送进去。
3)如果在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。
改为0.0.0.0/0的目的是为了在虚拟机中也可以访问(虚拟机ip与本机不同)
4、到了这一步,就可以用的测试文件在ubuntu中进行链接。首先将以下三个.cpp文件放入ubuntu中
//con.cpp #include#include using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { try{ connection C("dbname=testdb user=postgres password=123456 hostaddr=10.4.36.43 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } }
//table.cpp #include#include using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try{ connection C("dbname=testdb user=postgres password=123456 hostaddr=10.4.36.43 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } sql = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL," "AGE INT NOT NULL," "ADDRESS CHAr(50)," "SALARY REAL );"; work W(C); W.exec( sql ); W.commit(); cout << "Table created successfully" << endl; C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } return 0; }
//insert.cpp #include#include using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try{ connection C("dbname=testdb user=postgres password=123456 hostaddr=10.4.36.43 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; work W(C); W.exec( sql ); W.commit(); cout << "Records created successfully" << endl; C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } return 0; }
打开con.cpp、table.cpp、insert.cpp 修改ip以及PostgreSQL密码为自己的主机ip以及PostgreSQL密码
提示:主机IP查询方法 win+R 输入cmd打开终端 输入命令 ipconfig (linux下输入ifconfig)
5、修改完毕后,打开PostgreSQL,右键Databases,新建一个数据库,数据库名与table.cpp中建立的表名一致,为testdb
6、回到linux终端 依次输入以下命令,生成可执行文件
g++ con.cpp -o -con -lpqxx -lpq g++ table.cpp -o -table -lpqxx -lpq g++ insert.cpp -o -insert -lpqxx -lpq
6、依次链接 建表 插入
./con ./table ./insert
7、回到主机下,依次打开 tsestdb->schemas->Tables->Query Tool 输入以下语句
select * from company
即可按照insert.cpp中输入的数据进行建表。
8、需要将libpqxx配置在自己的开发环境中,下面展示在利用cMake构建的开发环境中配置libpqxx的方法:
在自己构建的工程目录下,打开src文件夹下的cMakeLists.txt文件夹,依次添加以下语句:
ADD_EXECUTABLE(pq con.cpp)
set(PQXX_INCLUDE_DIR /usr/include)
set(PQXX_LIBRARY_DIR /lib/x86_64-linux-gnu/)
FIND_PATH(
PQXX_INCLUDE_DIR
pqxx/pqxx
HINTS
${PQXX_INCLUDE_DIR}
)
FIND_LIBRARY(PQXX_LIBRARY
NAMES libpqxx-6.4.so libpqxx.a libpqxx.la libpqxx.so libpq.so.5 libpq.a libpq.so libpq.so.5.12
HINTS
${PQXX_LIBRARY_DIR})
FIND_PACKAGE_HANDLE_STANDARD_ARGS(pqxx DEFAULT_MSG
PQXX_INCLUDE_DIR
PQXX_LIBRARY
)
IF(pqxx_FOUND)
SET(PQXX_INCLUDE_DIR ${PQXX_INCLUDE_DIR})
SET(PQXX_LIBRARIES ${PQXX_LIBRARY})
MARK_AS_ADVANCED(
PQXX_LIBRARIES
PQXX_INCLUDE_DIR
PQXX_LIBRARY
)
ELSE()
SET(PQXX_LIBRARY "" CACHE STRING
"An optional hint to a directory for finding `PQXX`"
)
MESSAGE(FATAL_ERROR
"Could not find PQXX package. ")
ENDIF()
target_link_libraries( pq PRIVATE ${PQXX_LIBRARIES})
即可。



