PostgreSQL官方文档中列举了若干客户端接口,如下表:
Name | Language | Comments | Website |
---|---|---|---|
DBD::Pg | Perl | Perl DBI driver | https://metacpan.org/release/DBD-Pg |
JDBC | Java | Type 4 JDBC driver | https://jdbc.postgresql.org/ |
libpqxx | C++ | C++ interface | https://pqxx.org/ |
node-postgres | JavaScript | Node.js driver | https://node-postgres.com/ |
Npgsql | .NET | .NET data provider | https://www.npgsql.org/ |
pgtcl | Tcl | https://github.com/flightaware/Pgtcl | |
pgtclng | Tcl | https://sourceforge.net/projects/pgtclng/ | |
pq | Go | Pure Go driver for Go’s database/sql | https://github.com/lib/pq |
psqlODBC | ODBC | ODBC driver | https://odbc.postgresql.org/ |
psycopg | Python | DB API 2.0-compliant | https://www.psycopg.org/ |
根据我之前对PostgreSQL的了解,只知道PostgreSQ有libpq和ODBC 两款C API。 所以今天看到了libpqxx后忍不住想尝试一下。
git clone https://github.com/jtv/libpqxx
libpqxx有三种编译方式,分别是基于cmake、configure、和windows Visual C++;这里介绍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 --disable-documentation
注:我这里缺少一些文档生成相关的库,索性就不安装了,需要增加一个config选型–disable-documentation。
如果由于某些原因找不到pg_config或者有多个版本的PostgreSQL,想指定其中一个,可以覆盖环境变量PG_CONFIG
PG_CONFIG=/home/me/postgres/bin/pg_config
编译
make -j8
-j n,并行编译,n为并行数
需要依赖openssl开发库 yum install openssl-devel
编译并运行验证库功能的测试套件,过程中需要使用数据库。链接数据库是需要配置如下环境变量:
PGDATABASE # 数据库名,如:postgres
PGHOST # 数据库服务器地址,如:192.168.1.3,/tmp
PGPORT # 监听端口,如:5432,26000
PGUSER # 数据库用户名,如:postgres,omm
PGPASSWORD # 密码
make check -j 8
这是将 libpqxx 库和头文件安装到系统的位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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);
#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;
}
Libpqxx 中最基本的三种类型connection*、transaction、result。*
pqxx::connection C
;exec
, query_value
, 和 stream
函数来完成。pqxx::result
对象 pqxx::result R = W.exec("SELECT name FROM employee");
pqxx::result
是pqxx::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库的路径。
相对于ODBC和libpq接口libpqxx做了更高度的封装,但libpq使用的编译器版本和支持C++标准比较激进。从开发效率上应该比ODBC和libpq有较大提升,但性能方面有待于进一步的测试。