• libpqxx (PostgreSQL C++ API)——安装使用


    简介

    PostgreSQL官方文档中列举了若干客户端接口,如下表:

    NameLanguageCommentsWebsite
    DBD::PgPerlPerl DBI driverhttps://metacpan.org/release/DBD-Pg
    JDBCJavaType 4 JDBC driverhttps://jdbc.postgresql.org/
    libpqxxC++C++ interfacehttps://pqxx.org/
    node-postgresJavaScriptNode.js driverhttps://node-postgres.com/
    Npgsql.NET.NET data providerhttps://www.npgsql.org/
    pgtclTclhttps://github.com/flightaware/Pgtcl
    pgtclngTclhttps://sourceforge.net/projects/pgtclng/
    pqGoPure Go driver for Go’s database/sqlhttps://github.com/lib/pq
    psqlODBCODBCODBC driverhttps://odbc.postgresql.org/
    psycopgPythonDB API 2.0-complianthttps://www.psycopg.org/

    根据我之前对PostgreSQL的了解,只知道PostgreSQ有libpq和ODBC 两款C API。 所以今天看到了libpqxx后忍不住想尝试一下。

    软件获取

    git clone https://github.com/jtv/libpqxx
    
    • 1

    编译

    预备条件

    1. 编译libpqxx需要安装好PostgreSQL,客户端需要的头文件,libpq的库。
    2. 目前最新版本是7.7,7.0以上版本需要编译器支持c++ 17;6.0以上版本需要支持c++ 11 (我的gcc 版本是9.4.0,所以后面的演示以libpqxx 6.4版本为准)。

    libpqxx有三种编译方式,分别是基于cmake、configure、和windows Visual C++;这里介绍configure脚本的编译方式。

    configure 编译

    基于上面的预备条件,需要先把版本切换到6.4:

    frank@LAPTOP-4OF1323N:~/git/libpqxx$ git checkout 6.4
    Switched to branch '6.4'
    Your branch is up to date with 'origin/6.4'.
    frank@LAPTOP-4OF1323N:~/git/libpqxx$ git branch
    * 6.4
      master
    frank@LAPTOP-4OF1323N:~/git/libpqxx$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    configure

    ./configure --disable-documentation
    
    • 1

    注:我这里缺少一些文档生成相关的库,索性就不安装了,需要增加一个config选型–disable-documentation。
    如果由于某些原因找不到pg_config或者有多个版本的PostgreSQL,想指定其中一个,可以覆盖环境变量PG_CONFIG

    PG_CONFIG=/home/me/postgres/bin/pg_config
    
    • 1

    make

    编译

    make -j8
    
    • 1

    -j n,并行编译,n为并行数

    需要依赖openssl开发库 yum install openssl-devel

    make check

    编译并运行验证库功能的测试套件,过程中需要使用数据库。链接数据库是需要配置如下环境变量:

    PGDATABASE	# 数据库名,如:postgres
    PGHOST		# 数据库服务器地址,如:192.168.1.3,/tmp
    PGPORT		# 监听端口,如:5432,26000
    PGUSER		# 数据库用户名,如:postgres,omm
    PGPASSWORD	# 密码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    make check -j 8
    
    • 1

    make install

    这是将 libpqxx 库和头文件安装到系统的位置。

    image.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t2gaWWH5-1660622318665)(images/KaQlLXvxKxRt0cTEj6bsw7bzl4gnZpaMHbtkZlHSi1w.png)]

    范例

    测试表

    CREATE TABLE public.employee (
    	id int4 NULL,
    	"name" varchar(20) NULL,
    	gender bpchar(2) NULL,
    	birthday date NULL,
    	email bpchar(10) NULL,
    	remark varchar(50) NULL,
    	salary int8 NULL
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    insert into employee (id,name,gender,birthday,email,remark,salary) values(1,'frank','男','2014-02-23','f@123.com','',1000);
    
    • 1

    image.png

    范例代码

    #include 
    #include 
    
    int main()
    {
        try
        {
            pqxx::connection C;
            std::cout << "Connected to " << C.dbname() << std::endl;
            pqxx::work W(C);
    
            pqxx::result R = W.exec("SELECT name FROM employee");
    
            std::cout << "Found " << R.size() << "employees:" << std::endl;
            for (auto row: R)
                std::cout << row[0].c_str() << std::endl;
    
            std::cout << "Doubling all employees' salaries..." << std::endl;
            W.exec("UPDATE employee SET salary = salary*2");
    
            std::cout << "Making changes definite: ";
            W.commit();
            std::cout << "OK." << std::endl;
        }
        catch (const std::exception &e)
        {
            std::cerr << e.what() << std::endl;
            return 1;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Libpqxx 中最基本的三种类型connection*、transactionresult。*

    • 链接数据库需要创建一个connection,pqxx::connection C;
    • 在执行SQL之前需要创建一个事务 pqxx::work W©;
    • 执行SQL可以通过 exec, query_value, 和 stream函数来完成。
    • 大部分exec函数返回pqxx::result对象 pqxx::result R = W.exec("SELECT name FROM employee");
    • pqxx::resultpqxx::row的容器for (auto row: R)
    • pqxx::row 的下标表示这一行的第几列,从0开始,row[0].c_str(),及pqxx::filed对象

    编译范例

    g++ main.cpp -lpqxx -lpq  -L/home/frank/pgsql/lib
    
    • 1

    需要注意的是,根据依赖关系-lpqxx 要放在-lpq的前面,-L$PATH,可以指定你的libpq和libpqxx库的路径。

    运行范例

    • 运行前表数据:

    image.png

    • 运行范例

    image.png

    • 运行后表数据库

    image.png

    总结

    相对于ODBC和libpq接口libpqxx做了更高度的封装,但libpq使用的编译器版本和支持C++标准比较激进。从开发效率上应该比ODBC和libpq有较大提升,但性能方面有待于进一步的测试。

  • 相关阅读:
    3项目实战
    【云原生 | Kubernetes 系列】---Consul 安装配置
    操作系统13章(个人笔记)
    通讯录(纯C语言实现)
    细谈MySQL的一下经典问题(一)
    计算机网络第4章-IPv4
    Pyspark读写csv,txt,json,xlsx,xml,avro等文件
    MDK编译过程及ARM编译工具链
    Webpack 性能优化 二次编译速度提升3倍!
    【nginx】 nginx核心功能
  • 原文地址:https://blog.csdn.net/xk_xx/article/details/126363414