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`: 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;
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…

【已解决】windows7虚拟机安装VMtools频繁报错

为了在虚拟机VMware中安装win7&#xff0c;题主先在网上下载了windows7 professional版本的镜像&#xff0c;在vmware中安装vmtools时报错&#xff0c;信息如下 &#xff08;安装程序无法继续&#xff0c;本程序需要您将此虚拟机上安装的操作系统更新到SP1&#xff09; 然后就…

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢&#xff0c;之前也是看的&#xff0c;但是也很迷茫&#xff0c;感觉上虽然是对的&#xff0c;但是无法联系到应用里面&#xff0c;今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢&#xff0c;于是就返回FTP的应用了。 9.5.4 FTP 应…

高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算&#xff0c;存储 高精度加法 建议多在纸上画画&#xff0c;梳理思路 代码实现 输入字符串 //初始化数组存储 int a[250]{0}; int b[250]{0}; int c[251]{0}; //定义字符串&#xff0c;输入字符串 string s1,s2; getline(c…

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL&#xff0c;学习第一个容器string。 一、STL简介 在学习C数据结构和算法前&#xff0c;我…

数据结构的队列

一.队列 1.队列&#xff08;Queue&#xff09;的概念就是先进先出。 2.队列的用法&#xff0c;红色框和绿色框为两组&#xff0c;offer为插入元素&#xff0c;poll为删除元素&#xff0c;peek为查看元素红色的也是一样的。 3.LinkedList实现了Deque的接口&#xff0c;Deque又…

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

LabVIEW温度修正部件测试系统

LabVIEW温度修正部件测试系统 这个基于LabVIEW的温度修正部件测试系统旨在解决飞行器温度测量及修正电路的测试需求。该系统的意义在于提供一个可靠的测试平台&#xff0c;用于评估温度修正部件在实际飞行器环境中的性能表现&#xff0c;从而确保飞行器的安全性和可靠性。 系统…

vim的特殊模式-可视化模式

可视化模式&#xff1a;按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例&#xff1a; &#xff08;vim可视化模式的进阶使用&#xff1a;vim可视化模式的进阶操作-CSDN博客&#xff09;

mysql重学(一)mysql语句执行流程

思考 一条查询语句如何执行&#xff1f;mysql语句中若列不存在&#xff0c;则在哪个阶段报错一条更新语句如何执行&#xff1f;redolog和binlog的区别&#xff1f;为什么要引入WAL什么是Changbuf&#xff1f;如何工作写缓冲一定好吗&#xff1f;什么情况会引发刷脏页删除语句会…

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…

使用langchain ollama gradio搭建一个本地基于deepseek r1的RAG问答系统

目录 简介 环境配置 具体实现 安装依赖 定义模型和prompt 加载检索文档 切割 向量存储 创建检索器 实例化 前端搭建 实现效果 小tips 简介 首先介绍一下使用的几个工具&#xff0c;模型和rag的步骤&#xff0c;注&#xff1a;这里只是简单描述一下&#xff0c;不展…

Python中的函数(下)

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

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 许多人可能会跟老六哥一样&#xff0c;有过这样的体验&#xff1a;当我们遇到一个能力出众或对事物有独到见解的…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

Baklib如何提升企业知识管理效率与市场竞争力的五大对比分析

内容概要 在信息化时代&#xff0c;企业在知识管理方面面临着巨大的挑战与机遇。为了有效应对这些挑战&#xff0c;“Baklib”作为一个知识中台&#xff0c;通过其高度集成的数字化平台&#xff0c;为企业提供全方位的知识管理解决方案。特别是在以下五个领域&#xff0c;它展…

c++:vector

1.使用 1.1构造函数 常见的三种构造方式&#xff1a;空构造&#xff0c;拷贝构造&#xff0c;指定元素构造 1.2iterator begin和end也分为正向和反向。 注意&#xff1a;反向迭代器可以反向遍历是因为在定义rbegin和rend函数的时候把尾地址给到了rbegin&#xff0c;而不是说改…