当前位置: 首页 > 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; 这是因…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...