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

本文介绍了如何安装和使用libpqxx,这是一个C++接口的PostgreSQL客户端库。通过示例展示了如何建立连接、执行SQL和处理结果。libpqxx提供了比ODBC和libpq更高层次的封装,简化了数据库操作。
摘要由CSDN通过智能技术生成

简介

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. 编译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$

configure

./configure --disable-documentation

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

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

make

编译

make -j8

-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	# 密码
make check -j 8

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
);
insert into employee (id,name,gender,birthday,email,remark,salary) values(1,'frank','男','2014-02-23','f@123.com','',1000);

image.png

范例代码

#include <iostream>
#include <pqxx/pqxx>

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

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

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

运行范例

  • 运行前表数据:

image.png

  • 运行范例

image.png

  • 运行后表数据库

image.png

总结

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏 克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值