irpas技术客

PostgreSQL C++接口libpqxx在ubuntu下环境配置_GIS开发小白_c++ libpqxx

未知 5009

本次主要介绍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 <iostream> #include <pqxx/pqxx> 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 <iostream> #include <pqxx/pqxx> 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; } /* Create SQL statement */ sql = "CREATE TABLE COMPANY(" \ "ID INT PRIMARY KEY NOT NULL," \ "NAME TEXT NOT NULL," \ "AGE INT NOT NULL," \ "ADDRESS CHAR(50)," \ "SALARY REAL );"; /* Create a transactional object. */ work W(C); /* Execute SQL query */ 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 <iostream> #include <pqxx/pqxx> 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; } /* Create SQL statement */ 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 );"; /* Create a transactional object. */ work W(C); /* Execute SQL query */ 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})

即可。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #libpqxx #postgresql