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

news2025/5/11 0:49:01

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`: 00006792f9f8000000000000000b
 field `age`: 2
 field `name`: bar
 field `toys`: ["car", "ball"]
 name: bar
- toys:
  car
  ball

doc#1: {"_id": "00006792f9f8000000000000000c", "age": 3, "date": {"day": 20, "month": "Apr"}, "name": "baz"}
 field `_id`: 00006792f9f8000000000000000c
 field `age`: 3
 field `date`: {"day": 20, "month": "Apr"}
 field `name`: baz
 name: baz
- date field
  date `day`: 20
  date `month`: Apr
  month: Apr
  day: 20

Done!

除了会有输出外,会在服务器上建立一个数据库名为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;
      else
        cout << "- 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;
      else
        cout << "- 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;
      else
        cout << "- 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.coloradmin.cn/o/2284407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go理论知识——Go Channel 笔记 [特殊字符]

go理论知识——Go Channel 笔记 &#x1f4dd; 1. 基本概念 &#x1f9e0; 1.1 Channel 是什么&#xff1f; Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。Channel 是类型安全的&#xff0c;意味着你只能发送和接收特定类型的数据。 1.2 Channel 的创建 …

论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision?

论文阅读笔记&#xff1a;MambaOut: Do We Really Need Mamba for Vision? 1 背景2 创新点3 方法4 模块4.1 Mamba适合什么任务4.2 视觉识别任务是否有很长的序列4.3 视觉任务是否需要因果token混合模式4.4 关于Mamba对于视觉的必要性假设 5 效果 论文&#xff1a;https://arxi…

games101-(3/4)变换

缩放&#xff1a; 对称 切变 旋转 考虑&#xff08;1.0&#xff09;这个点 同理考虑&#xff08;0&#xff0c;1&#xff09;点即可 齐次方程 考虑在二维的坐标点后面增加一个维度 所有的仿射变换都可以写成齐次坐标的形式 a b c d 是线性变换 tx ty 是平移&#xff1b; …

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器&#xff1a;负责告诉磁盘是读还是写。 数据寄存器&#xff1a;给…

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档&#xff1f;文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES&#xff0c;最近在检索资料的时候翻阅到了 ES 的官方文档&#xff0c;里面对 ES 的基础与案例进行了通俗易懂的解释&#xff0c;读下来也有不少收获&#xff0…

海浪波高预测(背景调研)

#新星杯14天创作挑战营第7期# ps&#xff1a;图片由通义千问生成 历史工作&#xff1a; 针对更高细粒度、更高精度的波浪高度预测任务&#xff1a; Mumtaz Ali 等人提出了一种多元线性回归模型&#xff08;MLR-CWLS&#xff09;&#xff0c;该模型利用协方差加权最小二乘法&a…

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…

产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析

内容概要 在当前科技迅猛发展的时代&#xff0c;越来越多的企业意识到数字化转型的重要性。为了提升管理效率和智能化水平&#xff0c;产业园管理系统应运而生&#xff0c;成为众多园区和商办写字楼不可或缺的一部分。无论是工业园、物流园还是公寓&#xff0c;这些系统都能为…

LeetCode - #195 Swift 实现打印文件中的第十行

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式&#xff0c;之前我们说过&#xff0c;f(v)v&#xff0c;贝尔曼公式是满足contraction mapping theorem的&#xff0c;能够求解除它最优的策略和最优的state value&#xff0c;我们需要通过一个最优v*&#xff0c;这个v*来计算状态pi*&…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚&#xff0c;DeepSeek正式发布了全新的推理模型DeepSeek-R1&#xff0c;引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色&#xff0c;性能对标OpenAI的o1正式版。同时&#xff0c;DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算

【0】基础定义 按位与运算&#xff1a;全1取1&#xff0c;其余取0。按位或运算&#xff1a;全0取0&#xff0c;其余取1。 【1】引言 前序学习进程中&#xff0c;已经对图像按位与计算进行了详细探究&#xff0c;相关文章链接如下&#xff1a; python学opencv|读取图像&…

蓝桥杯省一

四个月从c&#xff0c;cpp&#xff0c;算法一起学到省一&#xff08;考研原因没参加国赛&#xff09; 有疑问可以关注私信哦 帖子后续也会持续更新&#xff0c;分享算法竞赛&#xff08;ccpc&#xff0c;天梯赛&#xff0c;蓝桥杯&#xff0c;浙大pta&#xff09;相关知识

C++ 新特性实现 ThreadPool

序言 在之前我们实现过线程池&#xff0c;但是非常基础。答题思路就是实现一个安全的队列&#xff0c;再通过 ThreadPool 来管理队列和线程&#xff0c;对外提供一个接口放入需要执行的函数&#xff0c;但是这个函数是无参无返回值的。  参数的问题我们可以使用 bind 来封装&a…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…