postgresql官方文档中列举了若干客户端接口,如下表:
name | language | comments | website |
---|---|---|---|
dbd::pg | perl | perl dbi driver | |
jdbc | java | type 4 jdbc driver | |
libpqxx | c | c interface | |
node-postgres | javascript | node.js driver | |
npgsql | .net | .net data provider | |
pgtcl | tcl | ||
pgtclng | tcl | ||
pq | go | pure go driver for go’s database/sql | |
psqlodbc | odbc | odbc driver | |
psycopg | python | db api 2.0-compliant |
根据我之前对postgresql的了解,只知道postgresq有libpq和odbc 两款c api。 所以今天看到了libpqxx后忍不住想尝试一下。
git clone https://github.com/jtv/libpqxx
预备条件
- 编译libpqxx需要安装好postgresql,客户端需要的头文件,libpq的库。
- 目前最新版本是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 库和头文件安装到系统的位置。
测试表
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。*
- 链接数据库需要创建一个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::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有较大提升,但性能方面有待于进一步的测试。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。