当前位置: 首页 > news >正文

ubuntu上尝试libpqxx库链接人大金仓

ubuntu上尝试libpqxx库链接人大金仓

C++的项目让使用国产数据库
运维给架了一个人大金仓数据库,
Kingbase 8 是基于 PostgreSQL 9.6 做的,
尝试直接使用libpqxx链接数据库。

文章目录

  • ubuntu上尝试libpqxx库链接人大金仓
    • 第一步 搭建libpqxx开发环境
      • 搜索libpqxx库
      • 安装libpqxx库
    • 第二步 连接数据库
      • 先搞个头文件进去
      • 库引进去
      • 尝试连接数据库
      • libpq版本
      • ubuntu18.04的libpq版本
      • 转战ubuntu18.04
      • 代码补全,再来一次
      • 初步结论
    • 第三步 执行SQL语句
      • 增加sql执行语句
      • 模式schema
      • 初步结论

第一步 搭建libpqxx开发环境

本人太懒,做个测试是在不想编译源码库,在apt上搜一下。

搜索libpqxx库

$ apt-cache search libpqxx | grep libpqxx
libpqxx-3.1 - C++ library to connect to PostgreSQL
libpqxx-3.1-dbg - C++ library to connect to PostgreSQL (debugging symbols)
libpqxx-4.0 - C++ library to connect to PostgreSQL
libpqxx-dbg - C++ library to connect to PostgreSQL (debugging symbols)
libpqxx-dev - C++ library to connect to PostgreSQL (development files)
libpqxx-doc - C++ library to connect to PostgreSQL (documentation)
libpqxx3-dev - C++ library to connect to PostgreSQL (development files)
libpqxx3-doc - C++ library to connect to PostgreSQL (documentation)```$ apt-cache search libpqxx | grep libpqxx
libpqxx-3.1 - C++ library to connect to PostgreSQL
libpqxx-3.1-dbg - C++ library to connect to PostgreSQL (debugging symbols)
libpqxx-4.0 - C++ library to connect to PostgreSQL
libpqxx-dbg - C++ library to connect to PostgreSQL (debugging symbols)
libpqxx-dev - C++ library to connect to PostgreSQL (development files)
libpqxx-doc - C++ library to connect to PostgreSQL (documentation)
libpqxx3-dev - C++ library to connect to PostgreSQL (development files)
libpqxx3-doc - C++ library to connect to PostgreSQL (documentation)
$ apt-cache depends libpqxx-dev
libpqxx-dev依赖: libpq-dev依赖: libpqxx-4.0依赖: pkg-configpkg-config:i386pkgconf冲突: <libpqxx4-dev>破坏: libpqxx3-dev建议: <libpqxx4-doc>替换: libpqxx3-dev替换: <libpqxx4-dev

运气不错,ubuntu16.04源还有有的,就是版本比较低,只有4版本。
聊胜于无,开搞。

安装libpqxx库

$ apt install libpqxx-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:comerr-dev krb5-multidev libgssapi-krb5-2 libgssrpc4 libk5crypto3 libkadm5clnt-mit9 libkadm5srv-mit9 libkdb5-8 libkrb5-3 libkrb5support0 libpq-dev libpq5 libpqxx-4.0 pkg-config
建议安装:doc-base krb5-doc krb5-user postgresql-doc-9.5 libpqxx4-doc
下列【新】软件包将被安装:comerr-dev krb5-multidev libgssrpc4 libkadm5clnt-mit9 libkadm5srv-mit9 libkdb5-8 libpq-dev libpq5 libpqxx-4.0 libpqxx-dev pkg-config
下列软件包将被升级:libgssapi-krb5-2 libk5crypto3 libkrb5-3 libkrb5support0
升级了 4 个软件包,新安装了 11 个软件包,要卸载 0 个软件包,有 101 个软件包未被升级。
需要下载 1,457 kB 的归档。
解压缩后会消耗 5,010 kB 的额外空间。
您希望继续执行吗? [Y/n] y
...
$ dpkg -L libpqxx-dev 
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libpqxx-dev
...
/usr/include
/usr/include/pqxx
...
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libpqxx.la
/usr/lib/x86_64-linux-gnu/libpqxx.a
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/libpqxx.pc
/usr/lib/x86_64-linux-gnu/libpqxx.so

齐活,开撸。

第二步 连接数据库

先随便百度了一个帖子:https://www.jianshu.com/p/8f5b6b3d7b38
照着搞

先搞个头文件进去

#include <pqxx/pqxx>

能找到,系统目录肯定能找到。

库引进去

set(LINK_LIB_LIST -lpq-lpqxx
)target_link_libraries(${PROJECT_NAME}${LINK_LIB_LIST}
)

编译没有问题

尝试连接数据库

#include <stdio.h>
#include <pqxx/pqxx>
#include <iostream>int main(int argn, char **argv)
{try{pqxx::connection db(std::string("dbname=videorelay user=system password=JuLong123 hostaddr=192.168.1.222 port=54321"));}catch (const std::exception &e){std::cerr << e.what() << std::endl;return -1;}printf("Hello World!\n");return 0;
}

报错了

SCRAM authentication requires libpq version 10 or above

字面意思是libpq版本需要大于10,
但是人大金仓是基于postgresql9.6做的,也有可能是要求数据库版本大于10.
数据库不是我部署的,先找找libpq的版本

libpq版本

root@xuean:~/workspace/test_libpqxx# dpkg -L libpq-dev | grep -F ".pc" | xargs cat
Name: libpq
Description: PostgreSQL libpq library
Url: http://www.postgresql.org/
Version: 9.5.25
Requires: 
Requires.private: 
Cflags: -I/usr/include/postgresql
Libs: -L/usr/lib/x86_64-linux-gnu -lpq
Libs.private: -L/usr/lib/mit-krb5 -L/usr/lib/x86_64-linux-gnu/mit-krb5 -lssl -lcrypto -lgssapi_krb5 -lcrypt -lldap_r

好吧,可能就像字面意思一样,是libpq版本太低,
还是懒得编译,到18.04上看看。

ubuntu18.04的libpq版本

$ apt-cache search libpqxx | grep libpqxx
libpqxx-4.0v5 - C++ library to connect to PostgreSQL
libpqxx-dev - C++ library to connect to PostgreSQL (development files)
libpqxx-doc - C++ library to connect to PostgreSQL (documentation)
libpqxx3-dev - Transitional dummy package for libpqxx-dev$ apt-cache depends libpqxx-dev
libpqxx-devDepends: pkg-configpkgconfDepends: libpq-devDepends: libpqxx-4.0v5Conflicts: <libpqxx4-dev>Breaks: libpqxx3-devSuggests: <libpqxx4-doc>Replaces: libpqxx3-devReplaces: <libpqxx4-dev>$ apt install -y libpqxx-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:libsecret-1-0 libsecret-common python-asn1crypto python-backports.ssl-match-hostname python-cached-property python-certifi python-cffi-backendpython-chardet python-cryptography python-dockerpty python-docopt python-enum34 python-funcsigs python-functools32 python-idna python-ipaddresspython-jsonschema python-mock python-openssl python-pbr python-pkg-resources python-requests python-six python-texttable python-urllib3python-websocket python-yaml
Use 'apt autoremove' to remove them.
The following additional packages will be installed:libpq-dev libpq5 libpqxx-4.0v5 pkg-config
Suggested packages:postgresql-doc-10 libpqxx4-doc
The following NEW packages will be installed:libpq-dev libpq5 libpqxx-4.0v5 libpqxx-dev pkg-config
0 upgraded, 5 newly installed, 0 to remove and 82 not upgraded.
...
# root @ ubuntu in ~/workspace/xuean_media on git:dev x [2:22:50] 
$ dpkg -L libpq-dev | grep -F ".pc" | xargs cat
Name: libpq
Description: PostgreSQL libpq library
Url: http://www.postgresql.org/
Version: 10.23
Requires: 
Requires.private: 
Cflags: -I/usr/include/postgresql
Libs: -L/usr/lib/x86_64-linux-gnu -lpq
Libs.private: -L/usr/lib/x86_64-linux-gnu/mit-krb5 -lssl -lcrypto -lgssapi_krb5 -lcrypt -lldap_r

天佑懒人,感谢上天。

转战ubuntu18.04

#include <stdio.h>
#include <pqxx/pqxx>
#include <iostream>int main(int argn, char **argv)
{try{pqxx::connection db(std::string("dbname=videorelay user=system password=JuLong123 hostaddr=192.168.1.222 port=54321"));}catch (const std::exception &e){std::cerr << e.what() << std::endl;return -1;}printf("Hello World!\n");return 0;
}

报错

致命错误:  数据库 "videorelay" 不存在

呵呵,有点意思了,改成正确的数据库名称不就可以么!

再编译

没有报错,可以运行了。

代码补全,再来一次

#include <stdio.h>
#include <pqxx/pqxx>
#include <iostream>int main(int argn, char **argv)
{try{pqxx::connection db(std::string("dbname=test user=system password=JuLong123 hostaddr=192.168.1.222 port=54321"));if (db.is_open()){std::cout << "Opened database successfully: " << db.dbname() << std::endl;}else{std::cout << "Can't open database" << std::endl;return 1;}db.disconnect();}catch (const std::exception &e){std::cerr << e.what() << std::endl;return -1;}printf("Hello World!\n");return 0;
}

输出信息

Opened database successfully: test
Hello World!

初步结论

使用libpq的10版本以上,可以连接到人大金仓数据库。

第三步 执行SQL语句

这次不找帖子了,直接去官网看看。
https://pqxx.org/development/libpqxx/

增加sql执行语句

#include <stdio.h>
#include <pqxx/pqxx>
#include <iostream>int main(int argn, char **argv)
{pqxx::connection *db = nullptr;try{db = new pqxx::connection(std::string("dbname=test user=system password=JuLong123 hostaddr=192.168.1.222 port=54321"));if (db->is_open()){std::cout << "Opened database successfully: " << db->dbname() << std::endl;}else{std::cout << "Can't open database" << std::endl;return -1;}}catch (const std::exception &e){std::cerr << e.what() << std::endl;return -1;}try{pqxx::work txn{*db};pqxx::result r{txn.exec("SELECT * FROM videorelay.gb_config_dictionary;")};auto size = r.size();for (int i = 0; i < size; i++){std::cout << r[i]["config_domain"].c_str() << "\t" << r[i]["config_key"].c_str() << "\t" << r[i]["config_name"].c_str() << std::endl;}txn.commit();}catch (const std::exception &e){std::cout << "Can't open database" << std::endl;return -1;}if (db != nullptr){try{db->disconnect();delete db;db = nullptr;}catch (const std::exception &e){std::cout << "Can't open database" << std::endl;return -1;}}printf("Hello World!\n");return 0;
}

官方的例子用的C++17标准,我这里还用着C++11标准拿
libpqxx也用到7+版本,我这里还是libpqxx4呢,猜着写好了。
略微修改,数据直接查出来来了。
莫名顺利。

模式schema

postgresql中有一个schema的概念,可以理解为对一个数据库里表的分组,但是不同分组内表名可以一样,所以查询时,带上schema更加准确。

初步结论

人大金仓使用libpqxx库做基本的查询是可以的,
初步比较,数据类型和部分属性还有sql语句上的差异比较大,
想在sql语句执行层抹平差异比较困难,估计得从数据查询接口层面磨平差异。
也就是说每个sql语句都需要调整。

相关文章:

ubuntu上尝试libpqxx库链接人大金仓

ubuntu上尝试libpqxx库链接人大金仓 C的项目让使用国产数据库 运维给架了一个人大金仓数据库&#xff0c; Kingbase 8 是基于 PostgreSQL 9.6 做的&#xff0c; 尝试直接使用libpqxx链接数据库。 文章目录ubuntu上尝试libpqxx库链接人大金仓第一步 搭建libpqxx开发环境搜索lib…...

【Python入门第十二天】Python 列表

Python 集合&#xff08;数组&#xff09; Python 编程语言中有四种集合数据类型&#xff1a; 列表&#xff08;List&#xff09;是一种有序和可更改的集合。允许重复的成员。元组&#xff08;Tuple&#xff09;是一种有序且不可更改的集合。允许重复的成员。集合&#xff08…...

Android 异步操作库 RxJava

RxJava概述 RxJava 是一种响应式编程&#xff0c;来创建基于事件的异步操作库。基于事件流的链式调用、逻辑清晰简洁。 RxJava 我的理解是将事件从起点&#xff08;上游&#xff09;流向终点&#xff08;下游&#xff09;&#xff0c;中间有很多卡片对数据进操作并传递&#x…...

2021-12-05青少年软件编程(C语言)等级考试试卷(六级)解析

2021-12-05青少年软件编程(C语言)等级考试试卷(六级)解析T1. 电话号码 给你一些电话号码,请判断它们是否是一致的,即是否有某个电话是另一个电话的前缀。比如: Emergency 911 Alice 97 625 999 Bob 91 12 54 26 在这个例子中,我们不可能拨通Bob的电话,因为Emergency的…...

github 使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、git与github二、出错的地方1.GitHub没有css样式2、git clone出现错误3、明明创建了responsibility 但git 不显示一、git与github 这个博客写的很好&#xff01;…...

Kubernetes集群维护—备份恢复与升级

Etcd数据库备份与恢复 需要先安装etcd备份工具yum install etcd -y按不同安装方式执行不同备份与恢复kubeadm部署方式&#xff1a; 备份&#xff1a;ETCDCTL_API3 etcdctl snapshot save snap.db --endpointshttps://127.0.0.1:2379 --cacert/etc/kubernetes/pki/etcd/ca.cr…...

前端开发常用案例(二)

这里写目录标题1.loding加载动画2.全屏加载动画效果3.吃豆豆4.鼠标悬停3D翻转效果5.3D旋转木马效果6.flex弹性布局-酷狗音乐播放列表flex弹性布局-今日头条首页热门视频栏grid网格布局-360图片展示小米商城左侧二级菜单1.loding加载动画 代码如下&#xff1a; <!DOCTYPE h…...

基于springboot+vue的儿科保健计划免疫系统

基于springbootvue的儿科保健计划免疫系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背…...

1.两数之和

难度简单给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序…...

字符串匹配 - 模式预处理:KMP 算法(Knuth-Morris-Pratt)

Knuth-Morris-Pratt算法&#xff08;简称KMP&#xff09;是最常用的字符串匹配算法之一。算法简介如下算法解释主要来源于这里&#xff0c;但是通常很难阅读完全&#xff0c;我推荐你直接进入下一节 图例解释部分。我们来观察一下朴素的字符串匹配算法的操作过程。如下图&#…...

工程师手册:电源设计中的电容选用规则

摘要 电源往往是我们在电路设计过程中最容易忽略的环节。作为一款优秀的设计&#xff0c;电源设计应当是很重要的&#xff0c;它很大程度影响了整个系统的性能和成本。电源设计中的电容使用&#xff0c;往往又是电源设计中最容易被忽略的地方。一、电源设计中电容的工作原理 在…...

【安全开发】专栏文章汇总

安全开发–1–TCP和UDP网络编程 安全开发–2–嗅探邮箱协议口令 安全开发–3–Python实现ARP缓存投毒 安全开发–4–SSH通信工具开发 安全开发–5–编写简单的netcat工具 安全开发–6–一个简单的TCP代理工具开发 安全开发–7–SSH隧道工具开发 安全开发–8–Python实现流量数据…...

视频监控流程图4

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"/> <link rel"stylesheet" type"text/css" href"visio.css"/> <title> 视频监控流程图 </title> <…...

「JVM 编译优化」Java 语法糖(泛型、自动装箱/拆箱、条件编译)

「JVM 编译优化」Java 语法糖&#xff08;泛型、自动装箱/拆箱、条件编译&#xff09; 语法糖可以看做事前端编译期的一些小把戏&#xff1b;虽不会提供实质性的功能改进&#xff0c;但它们或能提高效率&#xff0c;或能提升语法的严谨性&#xff0c;或能减少编码出错的机会&a…...

Linux下的进程控制

目录 退出码 终止进程 进程等待 进程程序替换 自己实现简易shell命令行 内建命令 退出码 在编写代码时main函数内部我们通常都使用return 0;结尾&#xff0c;以此标识正常退出。这里的return 0就是所谓的退出码&#xff0c;Linux下也是一样&#xff1a; 看这个小程序&…...

QT 文件监视系统QFileSystemWatcher监视目录的改变directoryChanged和监视文件的改变fileChanged

QT 文件监视系统QFileSystemWatcher监视目录的改变相关操作说明mainwindow.hmainwindow.cpp调试结果相关操作说明 添加头文件 Header: #include qmake: QT core bool QFileSystemWatcher::addPath(const QString &path)如果路径存在&#xff0c;则会向文件系统监视器添…...

Typescript基础知识(类型断言、类型别名、字符串字面量类型、枚举、交叉类型)

系列文章目录 引入一&#xff1a;Typescript基础引入&#xff08;基础类型、元组、枚举&#xff09; 引入二&#xff1a;Typescript面向对象引入&#xff08;接口、类、多态、重写、抽象类、访问修饰符&#xff09; 第一章&#xff1a;Typescript基础知识&#xff08;Typescri…...

Windows系统扩充C盘空间系列方法总结

目录前言方法一 使用自带的Windows的DiskPart扩充C盘1. 打开cmd2.三步命令方法二&#xff1a;使用Windows系统内置磁盘管理扩展C盘方法三. 使用专业磁盘分区工具总结前言 本教程是总结Windows系统进行C盘&#xff08;系统盘&#xff09;扩充空间的系列方法&#xff0c;一般来讲…...

华为OD机试 - 跳格子(Python)

跳格子 题目 地上共有N个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组steps数组给出, steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子: 比如[0,1]表示从跳完第0个格子以后…...

Java配置文件的值注入

1.平常使用直接在变量头上加上Value就可以把配置文件的值注入进来 Value(“${environment.active}”) private String environment; 2.但是变量使用static修饰时&#xff0c;就不能注入进来了 Value(“${environment.active}”) private static String environment; 这是因…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...