Linux下使用C++连接MySql8.0一二三事

2023-05-16

一  连接前准备

1  正确安装数据库 MySql 8.0

官网下载对应自己操作系统以及版本的包即可,这一步一定要正确安装。

推荐在官网https://dev.mysql.com/downloads/下载包,之后使用 dpkg 命令安装。

2  安装 boost 库

命令:

sudo apt-get install libboost-all-dev

3  安装 libmysqlclient 库

命令:

sudo apt-get install libmysqlclient-dev

注意,不安装这个库会提示错误(可能有多个):

libmysqlclient.so: cannot open shared object file: No such file or directory

4  安装 C++Connector 库

官网地址:https://dev.mysql.com/downloads/connector/cpp/

注意这几个库是不一样的,选择:

libmysqlcppconn8-2_8.0.20-1ubuntu18.04_amd64.deb

安装之后linux便能链接到这个库了,不过我们还需要头文件,把头文件写入CMakeList,之后链接 mysqlcppconn8 即可:

include_directories(/usr/include/mysql-cppconn-8)

link_libraries(mysqlcppconn8)

target_link_libraries(your_prj_name mysqlcppconn8)

5  CMakeLists

cmake_minimum_required(VERSION 3.16)
project(your_prj_name)

set(CMAKE_CXX_STANDARD 11)

#自身编写的头文件
include_directories(./include)

#外部头文件
#使用自己安装 mysqlcppconn8 的目录即可
include_directories(/usr/include/mysql-cppconn-8)

#项目源文件
set(SOURCE
        main.cpp
        source/xxx.cpp
        source/yyy.cpp
        source/zzz.cpp
        )

#链接外部库
link_libraries(mysqlcppconn8)

add_executable(your_prj_name ${SOURCE})
target_link_libraries(your_prj_name mysqlcppconn8)

二  连接数据库

为了方便测试,首先在 MySql 8.0 中创建数据库:webserver,并在库中创建表:

CREATE TABLE `webserver`.`user` (
  `username` VARCHAR(16) NOT NULL,
  `email` VARCHAR(255) NULL,
  `password` VARCHAR(32) NOT NULL,
  `create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`username`));

 在其中插入一条数据:

insert into user (`username`, `email`, `password`) values ('test', 'test@163.com', 'testpwd');

注意:`create_time`的数据类型是 TIMESTAMP,mysqlcppconn8 并不支持这样的数据类型(如果使用 C++ API 的话),使用C API中的 MYSQL_TIME 数据结构可以存取时间类型的数据,官方文档:

https://dev.mysql.com/doc/refman/8.0/en/c-api-prepared-statement-date-handling.html

若一定要使用 C++ API 官方建议在数据库中做类型转换(本文采取这种做法),官方文档:

https://forums.mysql.com/read.php?167,683855,683891#msg-683891

#include <iostream>
#include <mysqlx/xdevapi.h>

using namespace mysqlx;

void ptUser() {
    using std::cout;
    using std::endl;
    using std::vector;

    try {
        const char* url = "mysqlx://root:rootpwd@127.0.0.1:33060/webserver?ssl-mode=disabled";  
        //注意 mysqlcppconn8 默认使用的端口:33060,若连接3306端口会提示错误
        //使用用户名:root
        //用户 root 的密码是:rootpwd
        //主机:127.0.0.1
        //端口:33060
        //数据库:webserver

        cout << "Creating session on " << url
             << " ..." << endl;

        SessionSettings option("127.0.0.1", 33060, "root", "rootpwd");
        Session sess(option); //也可使用这种方式连接
        //Session sess(url);  第一种方式建立连接
        
        cout <<"Done!" <<endl;
        cout <<"Session accepted, creating collection..." <<endl;

        sess.sql("use webserver").execute();  //使用数据库 webserver

        //如何存取时间类型值,在 mysqlcppconn8 中并没有很好的规定
        //注意,我们在此处将字符串转为 timestamp 类型,以插入该条数据
        sess.sql(R"(insert into user (`username`, `email`, `password`, `create_time`) values
                         ('ice', 'kawaii@qq.com', '654321', timestamp('2020-06-14 17:00:00')))"
                         ).execute();

        //注意,我们在此处 timestamp 类型转换为字符串,以取出该条数据
        RowResult rs = sess.sql("select username, email, password, cast(create_time as char) from user").execute();
        for (auto it = rs.begin();it != rs.end();++it){
            cout << (*it).get(0).get<string>() <<" ";
            cout << (*it).get(1).get<string>() <<" ";
            cout << (*it).get(2).get<string>() <<" ";
            cout << (*it).get(3).get<string>();
            cout << endl;
        }

    } catch (const Error& e) {
        cout << e.what() <<endl;
    }
}

 输出结果如下:

Creating session on mysqlx://root:rootpwd@127.0.0.1:33060/webserver?ssl-mode=disabled ...
Done!
Session accepted, creating collection...
ice kawaii@qq.com 654321 2020-06-14 17:00:00
test test@163.com testpwd 2020-06-12 22:52:36

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下使用C++连接MySql8.0一二三事 的相关文章

  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 测试linux下磁盘空间不足

    我有一个程序 当写入某个文件的磁盘空间不足时 该程序可能会死掉 我不确定是否是这种情况 我想运行它并查看 但我的测试服务器不会很快耗尽空间 有什么办法可以嘲笑这种行为吗 看起来没有任何方法可以在 Ubuntu 中设置文件夹 文件大小限制 并
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐