docker配置mysql并使用mysql connector cpp编程

mysql

配置mysql使用docker

这里使用docker安装了,比较简洁,不想使用了直接就可以把容器删掉,首先获取下镜像,如下命令

docker pull container-registry.oracle.com/mysql/community-server

这里直接默认使用最新版本的mysql了

然后启动容器,如下命令,-P是端口映射,因为我们需要外面连接,因此加上,要不然不好连接

docker run --name=mysql --restart on-failure -d  -P container-registry.oracle.com/mysql/community-server:latest

登录mysql是需要密码的,因此我们需要找到密码,如下命令,使用docker

docker logs mysql 2>&1 | grep GENERATED

然后登入mysql修改下密码就行了,如下面命令

docker exec -it mysql mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

使用docker看下端口映射的情况,如下命令,8.0以上会有个33060是针对x插件的

docker ps

编程使用

这里来学习下各种db的编程使用,首先是耳熟能详的mysql,看了下官方文档,说有个新的c++ api叫Connector/C++,说是很屌的样子,支持sql语句和文档存储,那就从他开始吧,这里先搞c++了,本来想使用bazel来做包管理器呢,但是搜了下,bazel还没有支持这个库,我就使用vcpkg了。

首先使用vcpkg初始化下

vcpkg new --application
vcpkg add port fmt
vcpkg add port mysql-connector-cpp

具体如何配置可以看之前的博客 vcpkg 使用

我以为vcpkg已经非常成熟了,我直接加上依赖它就能自动下载完成,并把依赖搞完,我直接在cmake里面加上这个库就行了,但是发现有很多依赖是需要自己添加到cmake文件里面的,当然依赖它是自己下载完的,就是需要自己把其写道cmake里面,有点麻烦的,我下面写出cmake里面需要的依赖,还是比较麻烦的

cmake_minimum_required(VERSION 3.5.0)
project(mysqlConnectorCpp)
find_package(unofficial-mysql-connector-cpp CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(protobuf CONFIG REQUIRED)
find_package(ZLIB REQUIRED)
find_package(lz4 CONFIG REQUIRED)
find_package(zstd CONFIG REQUIRED)
add_executable(mysqlConnectorCpp main.cpp)
target_link_libraries(mysqlConnectorCpp PRIVATE unofficial::mysql-connector-cpp::connector)
target_link_libraries(mysqlConnectorCpp PRIVATE fmt::fmt)
target_link_libraries(mysqlConnectorCpp PRIVATE OpenSSL::SSL)
target_link_libraries(mysqlConnectorCpp PRIVATE OpenSSL::Crypto)
target_link_libraries(mysqlConnectorCpp PRIVATE protobuf::libprotobuf)
target_link_libraries(mysqlConnectorCpp PRIVATE ZLIB::ZLIB)
target_link_libraries(mysqlConnectorCpp PRIVATE lz4::lz4)
target_link_libraries(mysqlConnectorCpp PRIVATE zstd::libzstd)
target_link_libraries(mysqlConnectorCpp PRIVATE -lresolv -lutil)

把这些依赖搞完后,发现可以编译了,但是遇见了未知错误,如下,我认为是写的url是不对的。

Creating session on mysqlx://root@172.29.34.32:32770 ...
ERROR: CDK Error: unexpected message

找到问题所在了,这个使用connector的话,不能使用mysql的3306开的服务端口,需要使用专门的端口,这个也许是8.0以后单独开启的监听端口,因为我是docker安装的mysql,因此我们看下mysql的日志使用命令docker logs <container name>,我们可以看到X Plugin开启的端口是33060,因此我们的代码需要设置的端口是33060,而不是3306,因为使用的docker,因此需要看下主机映射的端口是哪个,然后再去连接就行了,大家去找下面的字眼就行了

2025-01-24T02:24:56.607449Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock

解决好这个问题就可以运行了,运行结果如下(port是我主机映射的端口):

Creating session on mysqlx://root@172.29.34.32:32769 ...
Session accepted, creating collection...
Inserting documents...
- added doc with id: 00006792f9f8000000000000000a
- added doc with id: 00006792f9f8000000000000000b
- added doc with id: 00006792f9f8000000000000000c
- added doc
Fetching documents...
doc#0: {"_id": "00006792f9f8000000000000000b", "age": 2, "name": "bar", "toys": ["car", "ball"]}field `_id`: 00006792f9f8000000000000000bfield `age`: 2field `name`: barfield `toys`: ["car", "ball"]name: bar
- toys:carballdoc#1: {"_id": "00006792f9f8000000000000000c", "age": 3, "date": {"day": 20, "month": "Apr"}, "name": "baz"}field `_id`: 00006792f9f8000000000000000cfield `age`: 3field `date`: {"day": 20, "month": "Apr"}field `name`: bazname: baz
- date fielddate `day`: 20date `month`: Aprmonth: Aprday: 20Done!

除了会有输出外,会在服务器上建立一个数据库名为test,并在test下面创建个名为c1的表,里面会添加四条记录,如下图

在这里插入图片描述

代码我也放出来了,就是官网的代码

#include <fmt/core.h>
#include <mysqlx/xdevapi.h>#include <iostream>using ::std::cout;
using ::std::endl;
using namespace ::mysqlx;int main(int argc, const char *argv[]) {try {const char *url =(argc > 1 ? argv[1] : "mysqlx://root@172.29.34.32:32769");cout << "Creating session on " << url << " ..." << endl;Session sess(url);{RowResult res = sess.sql("show variables like 'version'").execute();std::stringstream version;version << res.fetchOne().get(1).get<string>();int major_version;version >> major_version;if (major_version < 8) {cout << "Can work only with MySQL Server 8 or later" << endl;cout << "Done!" << endl;return 0;}}cout << "Session accepted, creating collection..." << endl;Schema sch = sess.createSchema("test", true);Collection coll = sch.createCollection("c1", true);cout << "Inserting documents..." << endl;coll.remove("true").execute();{Result add;add = coll.add(R"({ "name": "foo", "age": 1 })").execute();std::vector<string> ids = add.getGeneratedIds();cout << "- added doc with id: " << ids[0] << endl;add =coll.add(R"({ "name": "bar", "age": 2, "toys": [ "car", "ball" ] })").execute();ids = add.getGeneratedIds();if (ids.size() != 0)cout << "- added doc with id: " << ids[0] << endl;elsecout << "- added doc" << endl;add = coll.add(R"({"name": "baz","age": 3,"date": { "day": 20, "month": "Apr" }})").execute();ids = add.getGeneratedIds();if (ids.size() != 0)cout << "- added doc with id: " << ids[0] << endl;elsecout << "- added doc" << endl;add = coll.add(R"({ "_id": "myuuid-1", "name": "foo", "age": 7 })").execute();ids = add.getGeneratedIds();if (ids.size() != 0)cout << "- added doc with id: " << ids[0] << endl;elsecout << "- added doc" << endl;}cout << "Fetching documents..." << endl;DocResult docs = coll.find("age > 1 and name like 'ba%'").execute();int i = 0;for (DbDoc doc : docs) {cout << "doc#" << i++ << ": " << doc << endl;for (Field fld : doc) {cout << " field `" << fld << "`: " << doc[fld] << endl;}string name = doc["name"];cout << " name: " << name << endl;if (doc.hasField("date") && Value::DOCUMENT == doc.fieldType("date")) {cout << "- date field" << endl;DbDoc date = doc["date"];for (Field fld : date) {cout << "  date `" << fld << "`: " << date[fld] << endl;}string month = doc["date"]["month"];int day = date["day"];cout << "  month: " << month << endl;cout << "  day: " << day << endl;}if (doc.hasField("toys") && Value::ARRAY == doc.fieldType("toys")) {cout << "- toys:" << endl;for (auto toy : doc["toys"]) {cout << "  " << toy << endl;}}cout << endl;}cout << "Done!" << endl;} catch (const mysqlx::Error &err) {cout << "ERROR: " << err << endl;return 1;} catch (std::exception &ex) {cout << "STD EXCEPTION: " << ex.what() << endl;return 1;} catch (const char *ex) {cout << "EXCEPTION: " << ex << endl;return 1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。

佬们过年好呀~新年第一篇博客让我们来场赛博算命吧&#xff01; 更多文章&#xff1a;个人主页 系列文章&#xff1a;JAVA专栏 欢迎各位大佬来访哦~互三必回&#xff01;&#xff01;&#xff01; 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…

【16届蓝桥杯寒假刷题营】第2期DAY4

【16届蓝桥杯寒假刷题营】第2期DAY4 - 蓝桥云课 问题描述 幼儿园小班的浩楠同学有一个序列 a。 他想知道有多少个整数三元组 (i,j,k) 满足 1≤i,j,k≤n 且 ai​aj​ak​。 输入格式 共2行&#xff0c;第一行一个整数 n&#xff0c;表示序列的长度。 第二行 n 个整数&#x…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计&#xff0c;系统的结构框图如图2.1所示。其中包括了按键模块&#xff0c;温度检测模块&#xff0c;超声波液位检测模块&#xff0c;显示模块&#xff0c;蜂鸣器等器件设备。其中&#xff0c;采用STC89C52单片机作为主控…

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_8264829…

【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用

论文信息 标题: Dynamic Snake Convolution based on Topological Geometric Constraints for Tubular Structure Segmentation 作者: 戚耀磊、何宇霆、戚晓明、张媛、杨冠羽 会议: 2023 IEEE/CVF International Conference on Computer Vision (ICCV) 发表时间: 2023年10月…

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型&#xff0c;并部署了在线服务接口。供给客户端&#xff08;如&#xff1a;鸿蒙APP/元服务&#xff09;调用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…

Linux工具使用

1.gcc/g的使用 1.1程序翻译的过程 ①预处理&#xff1a;展开头文件&#xff0c;替换宏&#xff0c;调节编译&#xff0c;去注释。 ②编译&#xff1a;将代码变成汇编语言 ③汇编&#xff1a;将汇编代码变成二进制不可执行的目标文件。 ④链接&#xff1a;将多个我写的多个…

Mac Electron 应用签名(signature)和公证(notarization)

在MacOS 10.14.5之后&#xff0c;如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核&#xff0c;来判断是否存在病毒)&#xff0c;那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable&#xff0c;取消验证模式&#…

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…

[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器&#xff0c;现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统&#xff0c;对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项&#xff0c;启用共享文件夹 3、复…

DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型

DeepSeek 中文名深度求索人工智能基础技术研究有限公司(简称“深度求索”或“DeepSeek”)&#xff0c;成立于2023年&#xff0c;是一家专注于实现AGI的中国公司。 在本月初推出 DeepSeek-R1后&#xff0c;该公司宣称其在执行数学、编码和自然语言推理等任务时“性能可与OpenAI…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

简要介绍C语言与c++共有的数学函数

C语言和C都提供了丰富的数学函数&#xff0c;这些函数主要定义在 <math.h>&#xff08;C语言&#xff09;和 <cmath>&#xff08;C&#xff09;头文件中。以下分别介绍C语言与C共有的数学函数&#xff0c;以及C特有的数学函数。 C语言与C共有的数学函数&#xff08…

NVIDIA GPU介绍:概念、序列、核心、A100、H100

概述 入职一家大模型领域创业公司&#xff0c;恶补相关知识。 概念 一些概念&#xff1a; HPC&#xff1a;High Performance Computing&#xff0c;高性能计算SoC&#xff1a;System on Chip&#xff0c;单片系统FLOPS&#xff1a;Floating Point Operations Per Second&am…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

python算法和数据结构刷题[2]:链表、队列、栈

链表 链表的节点定义&#xff1a; class Node():def __init__(self,item,nextNone):self.itemitemself.nextNone 删除节点&#xff1a; 删除节点前的节点的next指针指向删除节点的后一个节点 添加节点&#xff1a; 单链表 class Node():"""单链表的结点&quo…

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容&#xff1a; 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置&#xff0c;我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…