libpqxx (PostgreSQL C++ API)——安裝使用
簡(jiǎn)介
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/ |
根據(jù)我之前對(duì)PostgreSQL的了解,只知道PostgreSQ有l(wèi)ibpq和ODBC 兩款C API。 所以今天看到了libpqxx后忍不住想嘗試一下。
軟件獲取
git clone https://github.com/jtv/libpqxx
編譯
預(yù)備條件
- 編譯libpqxx需要安裝好PostgreSQL,客戶端需要的頭文件,libpq的庫(kù)。
- 目前最新版本是7.7,7.0以上版本需要編譯器支持c++ 17;6.0以上版本需要支持c++ 11 (我的gcc 版本是9.4.0,所以后面的演示以libpqxx 6.4版本為準(zhǔn))。
libpqxx有三種編譯方式,分別是基于cmake、configure、和windows Visual C++;這里介紹configure腳本的編譯方式。
configure 編譯
基于上面的預(yù)備條件,需要先把版本切換到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
注:我這里缺少一些文檔生成相關(guān)的庫(kù),索性就不安裝了,需要增加一個(gè)config選型–disable-documentation。
如果由于某些原因找不到pg_config或者有多個(gè)版本的PostgreSQL,想指定其中一個(gè),可以覆蓋環(huán)境變量PG_CONFIG
PG_CONFIG=/home/me/postgres/bin/pg_config
make
編譯
make -j8
-j n,并行編譯,n為并行數(shù)
需要依賴openssl開(kāi)發(fā)庫(kù) yum install openssl-devel
make check
編譯并運(yùn)行驗(yàn)證庫(kù)功能的測(cè)試套件,過(guò)程中需要使用數(shù)據(jù)庫(kù)。鏈接數(shù)據(jù)庫(kù)是需要配置如下環(huán)境變量:
PGDATABASE # 數(shù)據(jù)庫(kù)名,如:postgres
PGHOST # 數(shù)據(jù)庫(kù)服務(wù)器地址,如:192.168.1.3,/tmp
PGPORT # 監(jiān)聽(tīng)端口,如:5432,26000
PGUSER # 數(shù)據(jù)庫(kù)用戶名,如:postgres,omm
PGPASSWORD # 密碼
make check -j 8
make install
這是將 libpqxx 庫(kù)和頭文件安裝到系統(tǒng)的位置。


范例
測(cè)試表
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 <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*、transaction、result。*
- 鏈接數(shù)據(jù)庫(kù)需要?jiǎng)?chuàng)建一個(gè)connection,
pqxx::connection C; - 在執(zhí)行SQL之前需要?jiǎng)?chuàng)建一個(gè)事務(wù) pqxx::work W?;
- 執(zhí)行SQL可以通過(guò)
exec,query_value, 和stream函數(shù)來(lái)完成。 - 大部分exec函數(shù)返回
pqxx::result對(duì)象pqxx::result R = W.exec("SELECT name FROM employee"); pqxx::result是pqxx::row的容器for (auto row: R)pqxx::row的下標(biāo)表示這一行的第幾列,從0開(kāi)始,row[0].c_str(),及pqxx::filed對(duì)象
編譯范例
g++ main.cpp -lpqxx -lpq -L/home/frank/pgsql/lib
需要注意的是,根據(jù)依賴關(guān)系-lpqxx 要放在-lpq的前面,-L$PATH,可以指定你的libpq和libpqxx庫(kù)的路徑。
運(yùn)行范例
- 運(yùn)行前表數(shù)據(jù):

- 運(yùn)行范例

- 運(yùn)行后表數(shù)據(jù)庫(kù)

總結(jié)
相對(duì)于ODBC和libpq接口libpqxx做了更高度的封裝,但libpq使用的編譯器版本和支持C++標(biāo)準(zhǔn)比較激進(jìn)。從開(kāi)發(fā)效率上應(yīng)該比ODBC和libpq有較大提升,但性能方面有待于進(jìn)一步的測(cè)試。




