PQXX是基于libpq加以封装, 进行C++风格重写的Postgres数据库API, 接下来介绍如何在Visual Studio 中配置使用PQXX
在此之前你需要安装postgres数据库软件, 关于安装PG的教程有非常多, 这里不作过多介绍.
首先你需要在Github上下载并解压pqxx的压缩包, 值得一提的是, 如果你不希望使用或碍于某些限制而不使用C++17及之后的新标准, 请你一定不要下载pqxx-master版本或pqxx-7.0之后的版本,
笔者使用的是6.3版本, 其可以在C++14标准下进行编译运行.
在你下载并解压完成后, 你需要创建一个文件夹,名为build.
接下来的过程是你应该掌握并熟悉的过程----用CMAKE去编译他
将第一个目录定位到解压好的文件夹下, 第二个目录定位到build文件夹下, 如果你之前忘了创建build文件夹, 这也没有关系, Cmake会提示是否需要帮助你生成一个
之后你应该点击Configure, 然后按照你自己的情况去选择这些选项. 点击Finish之后Cmake会帮你进行编译, 如果这里Camke提示出现了一些问题, 首先检查你的Cmake版本是否过于老旧. 之后可以在上方的Github网址中下滑寻找帮助.
在configure结束后, 你可以直接点击generate以生成解决方案.sln文件
我们返回到刚刚创建的build文件夹, 里面多了非常多东西, 但其中许多是我们不需要在乎的
现在我们需要打开libpqxx.sln文件
在Debug-x64模式下右键ALLBUILD, 选择生成(这个过程可能会持续2分钟)
同样地, 在Release-x64模式下再生成一次
如果这其中有一些子工程失败了, 不必担心, 我们只需要检查build->src->Debug 和 Release目录下是否生成了pqxx.lib和pqxx.dll文件, 如果没有生成这两个文件, 请考虑换一个更旧的libpqxx版本进行
将Debug目录下的pqxx.lib和pqxx.dll,pqxx.exp分别改名为pqxxd.lib, pqxxd.dll,pqxxd.exp以区分debug和release模式下生成的不同文件.
接下来将build->include下的pqxx文件夹里面的内容复制到libpqxx-x.x->include->pqxx下
接下来我们创建一个VS工程, 做一个小Demo来测试我们环境配置的正确性
在项目->属性->包含目录中添加libpqxx-x.x/include/路径
完成后测试一下能否正确包含这个文件(你可以将libpqxx-x.x->include文件夹的内容全部复制到VS的默认包含目录下, 即C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include, 这样你不需要更改属性中的包含目录, 但如果你不熟悉这类操作, 请不要这样做).
之后在你的工程文件夹下创建一个lib文件夹, 将之前生成的pqxxd.lib, pqxx.pdb, pqxxd.exp, pqxx.lib pqxx.exp复制到lib文件夹下
继续打开属性页, 将库目录改为lib\
在链接器->常规的附加库目录中也添加一条lib\
在链接器->输入->附加依赖项添加一条pqxxd.lib
注意, 配置上方的配置和平台, 平台要选择x64, 配置为Debug时添加一条pqxxd.lib, 配置为release时添加pqxx.lib, 并且当你更改配置的时候你需要重新修改引用目录和附加库目录
我们编写一个小Demo去连接数据库, 其中ConnectInfo中的host表示服务器址, 本地为::1(ipv6)或127.0.0.1(ipv4), user, dbname, password是你需要修改的
#include<pqxx/pqxx>
#include<iostream>
int main() {
std::string ConnectInfo("host=::1 user=postgres dbname=postgres password=lyx20021020");
try {
pqxx::connection _conn(ConnectInfo);
if (_conn.is_open()) {
std::cout << "OPEN_SUCCESS!" << std::endl;
}
else {
std::cout << "OPEN_FAILURE" << std::endl;
}
}
catch (std::exception& e) {
std::cout << e.what();
}
return 0;
}
运行之后会出现这种情况
不用担心, 将刚刚生成的dll文件拷贝到Demo->x64->Debug文件夹下并改名为pqxx.dll(如果是Release模式下拷贝生成的pqxx.dll到release文件夹下)
再次运行可以得到如下提示
我们找到安装PostgreSQL的位置 进入12->bin文件夹下, 由于程序运行所依赖的动态链接库不止如上提示的一个, 所以我建议你可以把所有的lib开头, dll结尾的文件全部拷贝到刚刚的debug/release目录下, 之后你可以慢慢研究哪些库是冗余的.
我们再运行一次程序
他成功了
接着我们进行一次简单的查询, 如果你有学习过数据库相关的知识, 你应该知道查询语句是什么
(注意这里将if和else中的内容调换了一下)
#include<pqxx/pqxx>
#include<iostream>
int main() {
std::string ConnectInfo("host=::1 user=postgres dbname=postgres password=lyx20021020");
try {
pqxx::connection _conn(ConnectInfo);
if (! _conn.is_open()) {
std::cout << "OPEN_FAILURE" << std::endl;
}
else {
std::cout << "OPEN_SUCCESS!" << std::endl;
pqxx::work w(_conn);
pqxx::result res = w.exec("Select* From Student;");
for (auto row = res.cbegin(); row != res.cend(); ++row) {
for (auto row_iter = row.cbegin(); row_iter != row.cend(); ++row_iter) {
std::cout << row_iter->c_str() << '\t';
}
}
work.commit();
}
}
catch (std::exception& e) {
std::cout << e.what();
}
return 0;
}
点击运行你可能会发现输出的是乱码
具体的原因在这里不作过多介绍, 你只需要知道这是由于字符集不一致的问题
你需要在这里将字符集设置为Unicode
并且在连接之后先执行一条这样的语句"Set client_encoding to 'GBK';"
这样你就可以得到正确的输出了
完整的源代码如下所示:
#include<pqxx/pqxx>
#include<iostream>
int main() {
std::string ConnectInfo("host=::1 user=postgres dbname=postgres password=lyx20021020");
try {
pqxx::connection _conn(ConnectInfo);
if (! _conn.is_open()) {
std::cout << "OPEN_FAILURE" << std::endl;
}
else {
std::cout << "OPEN_SUCCESS!" << std::endl;
pqxx::work w(_conn);
w.exec("Set client_encoding to 'GBK';");
pqxx::result res = w.exec("Select* From Student;");
for (auto row = res.cbegin(); row != res.cend(); ++row) {
for (auto row_iter = row.cbegin(); row_iter != row.cend(); ++row_iter) {
std::cout << row_iter->c_str() << '\t';
}
}
}
}
catch (std::exception& e) {
std::cout << e.what();
}
return 0;
}
这样以来, 你就学会了如何配置pqxx库以及写一个简单的查询语句并且得到查询结果. 得益于迭代器算法, 你几乎可以在任何情况下这样去访问执行查询语句所返回的结果.