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的项目让使用国产数据库 运维给架了一个人大金仓数据库, Kingbase 8 是基于 PostgreSQL 9.6 做的, 尝试直接使用libpqxx链接数据库。 文章目录ubuntu上尝试libpqxx库链接人大金仓第一步 搭建libpqxx开发环境搜索lib…...
【Python入门第十二天】Python 列表
Python 集合(数组) Python 编程语言中有四种集合数据类型: 列表(List)是一种有序和可更改的集合。允许重复的成员。元组(Tuple)是一种有序且不可更改的集合。允许重复的成员。集合(…...
Android 异步操作库 RxJava
RxJava概述 RxJava 是一种响应式编程,来创建基于事件的异步操作库。基于事件流的链式调用、逻辑清晰简洁。 RxJava 我的理解是将事件从起点(上游)流向终点(下游),中间有很多卡片对数据进操作并传递&#x…...
2021-12-05青少年软件编程(C语言)等级考试试卷(六级)解析
2021-12-05青少年软件编程(C语言)等级考试试卷(六级)解析T1. 电话号码 给你一些电话号码,请判断它们是否是一致的,即是否有某个电话是另一个电话的前缀。比如: Emergency 911 Alice 97 625 999 Bob 91 12 54 26 在这个例子中,我们不可能拨通Bob的电话,因为Emergency的…...
github 使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、git与github二、出错的地方1.GitHub没有css样式2、git clone出现错误3、明明创建了responsibility 但git 不显示一、git与github 这个博客写的很好!…...
Kubernetes集群维护—备份恢复与升级
Etcd数据库备份与恢复 需要先安装etcd备份工具yum install etcd -y按不同安装方式执行不同备份与恢复kubeadm部署方式: 备份: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加载动画 代码如下: <!DOCTYPE h…...
基于springboot+vue的儿科保健计划免疫系统
基于springbootvue的儿科保健计划免疫系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背…...
1.两数之和
难度简单给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序…...
字符串匹配 - 模式预处理:KMP 算法(Knuth-Morris-Pratt)
Knuth-Morris-Pratt算法(简称KMP)是最常用的字符串匹配算法之一。算法简介如下算法解释主要来源于这里,但是通常很难阅读完全,我推荐你直接进入下一节 图例解释部分。我们来观察一下朴素的字符串匹配算法的操作过程。如下图&#…...
工程师手册:电源设计中的电容选用规则
摘要 电源往往是我们在电路设计过程中最容易忽略的环节。作为一款优秀的设计,电源设计应当是很重要的,它很大程度影响了整个系统的性能和成本。电源设计中的电容使用,往往又是电源设计中最容易被忽略的地方。一、电源设计中电容的工作原理 在…...
【安全开发】专栏文章汇总
安全开发–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 语法糖(泛型、自动装箱/拆箱、条件编译) 语法糖可以看做事前端编译期的一些小把戏;虽不会提供实质性的功能改进,但它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会&a…...
Linux下的进程控制
目录 退出码 终止进程 进程等待 进程程序替换 自己实现简易shell命令行 内建命令 退出码 在编写代码时main函数内部我们通常都使用return 0;结尾,以此标识正常退出。这里的return 0就是所谓的退出码,Linux下也是一样: 看这个小程序&…...
QT 文件监视系统QFileSystemWatcher监视目录的改变directoryChanged和监视文件的改变fileChanged
QT 文件监视系统QFileSystemWatcher监视目录的改变相关操作说明mainwindow.hmainwindow.cpp调试结果相关操作说明 添加头文件 Header: #include qmake: QT core bool QFileSystemWatcher::addPath(const QString &path)如果路径存在,则会向文件系统监视器添…...
Typescript基础知识(类型断言、类型别名、字符串字面量类型、枚举、交叉类型)
系列文章目录 引入一:Typescript基础引入(基础类型、元组、枚举) 引入二:Typescript面向对象引入(接口、类、多态、重写、抽象类、访问修饰符) 第一章:Typescript基础知识(Typescri…...
Windows系统扩充C盘空间系列方法总结
目录前言方法一 使用自带的Windows的DiskPart扩充C盘1. 打开cmd2.三步命令方法二:使用Windows系统内置磁盘管理扩展C盘方法三. 使用专业磁盘分区工具总结前言 本教程是总结Windows系统进行C盘(系统盘)扩充空间的系列方法,一般来讲…...
华为OD机试 - 跳格子(Python)
跳格子 题目 地上共有N个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组steps数组给出, steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子: 比如[0,1]表示从跳完第0个格子以后…...
Java配置文件的值注入
1.平常使用直接在变量头上加上Value就可以把配置文件的值注入进来 Value(“${environment.active}”) private String environment; 2.但是变量使用static修饰时,就不能注入进来了 Value(“${environment.active}”) private static String environment; 这是因…...
SAP 订单BOM与销售BOM的区别
订单BOM与销售BOM的区别 訂單BOM: 是實際生產時用的BOM, 在標準BOM和銷售BOM基礎上增減物料的BOM 銷售BOM: 是為特定客戶設定的BOM, 在主檔數據層次上的BOM, 在生產時是帶到訂單BOM中去的. 標準BOM: 是公司為標準生產的BOM, 在主檔數據層次上的BOM, 在生產時是帶到訂單BOM中去的…...
支付宝支付详细流程
1、二维码的生成二维码生成坐标 <!-- zxing生成二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>co…...
TCP 的演化史-fast retransmit/recovery
工作原因要对一个 newreno 实现增加 sack 支持。尝试写了 3 天 C,同时一遍又一遍梳理 sack 标准演进。这些东西我早就了解,但涉及落地写实现,就得不断抠细节,试图写一个完备的实现。 这事有更简单的方法。根本没必要完全实现 RFC…...
CSS基础选择器,你认识多少?
前言在上一文初识CSS中,我们了解到了其格式:选择器{ }在初步尝试使用时,我们笼统的直接输入了p { }以选择p标签来对其操作,而这一章节里,我们再进一步探索有关基础选择器的相关内容,理解选择器的作用。选择…...
ChatGPT入门案例|商务智能对话客服(三)
本篇介绍智能客服的基本功能架构和基本概念,并利用对话流技术构建商务智能应用。 01、商务智能客服功能结构 互联网的发展已经深入到社会的各个方面,智能化发展已经成为社会发展的大趋势。在大数据和互联网时代,企业和组织愈加重视客户沟通…...
Matlab 最小二乘法拟合平面(SVD)
文章目录 一、简介1.1最小二乘法拟合平面1.2 SVD角度二、实现代码三、实现效果参考资料一、简介 1.1最小二乘法拟合平面 之前我们使用过最为经典的方式对平面进行了最小二乘拟合(点云最小二乘法拟合平面),其推导过程如下所示: 仔细观察一下可以发现...
AtCoder Regular Contest 126 D题题解
思路 首先我们看看假设选中 mmm 个数后的答案。 我们首先现将 mmm 个数移动到一起,在将他们重新排序。 我们知道,mmm 个数移在一起时,当位于中间的那个数不动时交换次数最少,于是可以列出式子(cic_ici 是点 iii 的…...
Android R WiFi热点流程浅析
Android R WiFi热点流程浅析 Android上的WiFi SoftAp功能是用户常用的功能之一,它能让我们分享手机的网络给其他设备使用。 那Android系统是如何实现SoftAp的呢,这里在FWK层面做一个简要的流程分析,供自己记录和大家参考。 以Android R版本为…...
【C++进阶】二、多态详解(总)
目录 一、多态的概念 二、多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 虚函数重写的两个例外 2.4.1 协变 2.4.2 析构函数的重写 2.5 C11 override 和 final 2.5.1 final 2.5.2 override 2.6 重载、覆盖(重写)、隐藏(重定义)的对比 三、…...
node-sass@4.14.1 包含风险, 如何升级依赖至 dart-sass
文章目录需求我上网都查到了哪些信息在 github 看到了 node-sass 依赖的最新版本的列表:关于方案2的失败不同版本的 nodejs 和 node-sass依赖的**适配关系**从何得知替代方案——dart-sass如何安装 dart sass?需求 在做一个基于Node、React的前端项目&a…...
运营最好的网站/长沙seo公司
语法 Object.entries(obj) 参数 obj可以返回其可枚举属性的键值对的对象。返回值 给定对象自身可枚举属性的键值对数组 语法 Object.fromEntries(iterable);是 Object.entries 的反转 参数 iterable可迭代对象,类似 Array 、 Map 或者其它实现了可迭代协议的对象。返…...
网站开发费计入什么会计科目/怎么建立自己的企业网站
注:继前段时间连载多篇 ELF 相关文章后,今次再连载 4 篇,每周 1 篇,欢迎关注并分享。分享本文到朋友圈后再加微信 tinylab 可以申请整个系列的 PDF 合集(共 15 篇,126 页)。Linux ELF 系列文章合…...
网站上做旅游卖家要学什么/引流软件有哪些
很久之前就看过attention的相关知识,只是没有动手实践,所以很多小细节没有考虑到. (1)sequence-to-sequence model中,在解码的第一步S0_00是如何计算的就晕了好一阵,下面的图给出了…...
礼嘉网络推广/西安做seo的公司
2019独角兽企业重金招聘Python工程师标准>>> ORACLE日期时间函数大全 (二) 2010-05-11 13:36 13.年月日的处理 select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years*12months ) ) ) daysfrom ( select trunc(mont…...
网上北京网站制作公司/百度推广seo是什么意思
想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构师之路有一定的参考。…...
网站后台word编辑器/长沙百度搜索排名优化
一、静态绑定和动态绑定的区别在Java中,当你调用一个方法时,可能会在编译时期(compile time)解析(resolve),也可能实在运行时期(runtime)解析,这全取决于到底是一个静态方法(static method)还是一个虚方法(virtual method)。如果是…...