Clion + mysql (win/Mac + 本地/远程)

【新手教程】那些年我用clion操作mysql的一些经验教训

使用clion自带的数据库工具,对数据库进行操作

连接本地数据库

IDEA如何连接本地mysql?
Clion的连接方式和IDEA的连接方式是一样的,直接看这个博客吧

ps:如果你有“工具能够使用数据库,就相当于我写的项目连接上数据库了”这种想法,我很遗憾地告诉你,并不是,这里的连接只是单纯的对数据库进行一系列的操作,和你的项目无关,如果此时你点击项目的运行绿标,它仍然会告诉你一堆报错

建库

在这里插入图片描述
在这里插入图片描述

建表

在这里插入图片描述
在这里插入图片描述

编辑表格

在这里插入图片描述
在这里插入图片描述
这里说的选中格子指的是需要 手动 点击格子,习惯了tab键的我内心是有点崩溃的

修改字段名

在这里插入图片描述

查询数据

这一步是在console里操作的
在这里插入图片描述在这里插入图片描述
反正我这辈子是不可能再去cmd里敲命令了!舒服~
除了查询数据,之前提到的建库,建表,删库等等,也都可以在这里完成

插入新的数据

在这里插入图片描述
在这里插入图片描述
当然点表格里的同样的按钮刷新也是一样的


sql常用语句(mysql版)

create database 数据库名; // 建库
use 数据库名; // 选择数据库
create table 数据表名 (column_name column_type); // 建表
insert into 数据表名 ( field1, field2,...fieldN ) values ( value1, value2,...valueN ); // 插入数据
select column_name,column_name from table_name [where Clause] [LIMIT N][ OFFSET M]; // 查询数据
delete from 表名 where 条件; //删除数据
update 数据表名 set 字段名 =where 条件; // 修改数据
alter table 数据表名 change 原字段名 新字段名 新字段的类型 ; //修改字段

【win】Clion工程连接Mysql数据库

官网提供的三种连接的方式

官网说:
windows系统上,C++项目要连接Mysql,有以下几种方法:(不管是本地的还是外部服务器,差别也就只是填写的ip地址)

  1. 以纯C的方式,使用Mysql Server 8.0里的libmysql.liblibmysql.dll动态库
  2. 以C++11的方式,使用Connector/C++ 8.0,支持以JDBC的方式连接数据库
  3. 以ODBC的方式(目前我只会用 Qt 以 ODBC 的方式连接SqlServer)

纯C的好处是移植性比C++11的要好,且更快;C++11的好处则是面向对象,写起来舒服,写过Java的不愁写C++,但是前提是必须提前安装过OpenSSL

ps:在没学会看官方指南之前,我一直以为第一种只能连接本地Mysql,咳咳,我真傻

1. 以纯C的方式连接Mysql

找到mysql下的这两个文件,复制他们的路径到自己的工程的CMakeList.txt里
在这里插入图片描述
在这里插入图片描述
注意:

  1. 路径里面的空格前面都需要加 \
  2. 路径必须是绝对路径
  3. 写成link_libraries( libmysql.lib libmysql.dll )也行

然后把libmysql.dll和libmysql.lib这两个文件拷贝到cmake-build-debug文件夹里
ps:这一步是为了防止移植程序后报错说libmysql.*找不到
在这里插入图片描述
在这里插入图片描述

然后就能使用mysql.h了
在这里插入图片描述

C++ API方式连接mysql数据库实现增删改查
C++中string、char *、char[]的转换
mysql之char和varchar的区别
菜鸟教程 - MySQL 教程

代码模板

咳咳 不好意思
这份模板写的时间比较早,当时对Mysql的这种连接方式不是很了解,
明明是c却混进了c++,写的挺烂的,以后找个时间改改,改成全c可移植的 ,ԾㅂԾ,

//--------------这部分放头文件----------------------
#include <mysql.h>
#include <bits/stdc++.h>
using namespace std;

void textMysql();//测试方法
bool ConnectMysql();//连接数据库
bool QueryDatabase(string sql);//查询并输出结果
void outMysql();//输出查询结果
bool updateData(string sql);//插入删除修改操作
void FreeConnect();//释放资源

//---------------这部分放源文件------------------------

MYSQL mysql;
MYSQL_RES *res;//这个结构代表返回行的一个查询结果集
MYSQL_ROW column;//一个行数据的类型安全(type-safe)的表示

//测试代码
void textMysql() {
    ConnectMysql();
    QueryDatabase("select * from student");
    FreeConnect();
}

//连接数据库
bool ConnectMysql() {
    mysql_init(&mysql);//初始化mysql
    if (!(mysql_real_connect(&mysql,
                             "localhost",//主机 如果是远程就改成服务器的ip地址
                             "root",//用户名
                             "",//密码
                             "myDatabase",//数据库名 必须是已经存在的 我的mysql大小写不敏感
                             3306,//端口号 默认的0或者3306
                             NULL, 0//最后两个参数的常用写法 几乎都是这两个
    ))) {
        cout << "Error connecting to database:" + (string) mysql_error(&mysql) << endl;
        return false;
    } else {
        cout << "Connected..." << endl;
        return true;
    }
}

//所有的数据库操作都是先写个sql语句
//然后用mysql_query(&mysql,query)来完成
//包括创建数据库或表 增删改查
bool updateData(string sql){
    mysql_query(&mysql, "set names utf8");//设置编码格式 否则mysql里中文乱码
    // 执行SQL语句
    // 0 执行成功
    // 1 执行失败
    if (mysql_query(&mysql, sql.c_str())) {//mysql_query第二个参数只接受const cahr* 需要将string类型转化
        cout << "Update failed ( " + (string) mysql_error(&mysql) + " )" << endl;
        return false;
    } else {
        cout << "Update success..." << endl;
        return true;
    }
}

//查询并输出
bool QueryDatabase(string sql) {
    mysql_query(&mysql, "set names gbk");//设置编码格式 否则cmd下中文乱码
    // 执行SQL语句
    // 0 执行成功
    // 1 执行失败
    if (mysql_query(&mysql, sql.c_str())) {//mysql_query第二个参数只接受const cahr* 需要将string类型转化
        cout << "Query failed ( " + (string) mysql_error(&mysql) + " )" << endl;
        return false;
    } else {
        cout << "query success" << endl;
    }

    //获得结果集 MYSQL_RES *res;
    if (!(res = mysql_store_result(&mysql))) {
        cout << "Couldn't get result from " + (string) mysql_error(&mysql) << endl;
        return false;
    }
    outMysql();//打印结果
    return true;
}

//输出结果
void outMysql() {
    //打印数据行数
    cout << "number of dataline returned: " << mysql_affected_rows(&mysql) << endl;

    char *field[32];//字段名

    int num = mysql_num_fields(res);//获取列数
    for (int i = 0; i < num; ++i) {//获取字段名
        field[i] = mysql_fetch_field(res)->name;
    }

    for (int i = 0; i < num; ++i) {
        cout << (string) field[i] << "    ";
    }
    cout << endl;

    while (column = mysql_fetch_row(res)) {//获取一行数据
        for (int i = 0; i < num; ++i) {
            cout << column[i] << "    ";
        }
        cout << endl;
    }
}

//释放资源
void FreeConnect() {
    mysql_free_result(res);
    mysql_close(&mysql);
}

2. 以C++11的方式连接Mysql

前提:本方法只适用8.0.23及以上版本的Connector/C++ 8.0

报错

undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&)

代码模板

服务器上远程连接所需的基本配置

如果你要连接的是本地服务器,就不需要看这一部分啦!

我远程服务器上的mysql是8.0.28版本的

菜鸟教程上很详细的讲了如何初次安装运行mysql 菜鸟教程 - MySQL 安装

其中安装mysql有很多方法,有像我上文写的那样依靠install安装器,也有直接下载relase版本的,因为服务器的参数不咋滴,也只需要有一个数据库地功能就行了,为求高效,这里采用的是后者

其中有几个点需要注意一下:

  1. 新建的 my.ini 文件不要完全照抄,里面有一个参数basedir,必须是解压后的mysql包所在的目录,不要填错了
  2. relase版本的mysql如果没有在环境变量里设置,是无法全局使用的
  3. 按照教程初始化系统得到的密码只能进入mysql,授权操作不能执行(这个在后面会用到),进入mysql的第一步就应该是改密码 alter user 'root'@'localhost' identified by '新的密码';

安装好的mysql默认是只能本地连接的,外部不可访问,远程连接需要授权,因为安全问题,我选择新建了一个用户,并只允许该用户访问特定的数据库

注意:mysql8.0的版本在新建并授权用户的方法上和菜鸟教程里讲的有些不符,步骤需要拆分,只能先新建后授权,否则会出现语法错误的报错

进入mysql后输入以下步骤

# 新建数据库 
create database 数据库名

# 新建用户
# create user '用户名'@'主机号' identified by '密码'
# 主机号设置为'%' 表示任意ip的主机
create user '用户名'@'%' identified by '密码'

# 给用户授权
# grant all privileges on *.* to '用户名'@'%'; 这样写就可以访问mysql内所有表
grant all privileges on 指定库.* to '用户名'@'%';

使用Clion作为数据库工具,远程使用服务器上的数据库

服务器上的开放了权限后,就应该去本地clion上测试一下是否成功、看看能不能本地操作

注意:这一步并不能让实际项目连接数据库,只是单纯地使用clion远程操作数据库而已

在这里插入图片描述
在这里插入图片描述
连接mysql的端口号一般都默认是是3306,也就是my.ini里设置的信息

然后切换到SSH/SSL选项,这里是填写服务器的信息,ssh隧道连接服务器

在这里插入图片描述

在进行下一步之前,请先确认一下 您的win10服务器上 openssh服务器和客户端 都已正确安装并且正在运行
openssh安装:屏幕左下角直接搜索 管理可选功能 ,然后慢慢找openssh服务器、openssh客户端
openssh运行:屏幕左下角直接搜索 服务(桌面应用那个),找到所有openssh相关的服务(应该是两个),然后右键点启动

再回到本地clion上来,
在这里插入图片描述
然后正常应用就可以连接上指定远程数据库了

注意:在正式使用前,一定要先测试一下mysql内的时间是否和本地时间相同,比如说linux服务器上的mysql就会和北京时间相差八个小时,一般来说win10服务器上的是一样的


ps:

尝试过用idea、rider连接mysql后,再回来看clion,只能感叹:当时为什么想不开要用clion???

idea有npm,rider有nuget,就连pycharm都有pip可以下载第三方库,解决mysql需要的连接问题,为啥想不开要用只有文件管理的cmake的clion???

java连接找connector-JAVA包,c#连接找connector-NET,为啥c++不是直接找connector-C++包e而是Mysql Server???

再度重回c++,人都给整傻了…


【mac】Clion工程连接Mysql数据库

intel芯片的mac

具体连接步骤

前提:

  1. 已经通过某种方式安装好了mysql (太久之前安装的,具体过程给忘了,这个可以百度到)
    ps:安装MSQL前注意先观察一下mac搭载的是哪一种芯片,M1需要下载对应的MySql,否则会出现ARM64
    感谢 typ maxval 的提示
  2. 已经创建好了要连接的数据库

新安装的mysql是无法全局使用的,具体方法详见 - Mac os安装MySQL数据库,系统提示mysql: command not found该怎么办

首先打开mysql的相关配置文件,如果你不知道它在哪儿:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
把这段路径拷贝下来,然后打开mac启动台里的终端:
在这里插入图片描述
输入 open /usr/local/mysql
意思是打开(open) 这个路径所对应的文件夹,然后找到下面两个文件夹,拷贝他们的路径

在这里插入图片描述

如果你不知道路径怎么拷贝:
随便双击点击这两个文件中的一个,然后会跳出菜单栏,选择显示简介
在这里插入图片描述

在如图所示的位置双击,然后就能拷贝地址了
在这里插入图片描述

同时,我们还需要记住这个文件夹的路径
在这里插入图片描述

记下这三个路径后打开我们的工程文件,找到CMakeLists.txt这个文件(我的clion用了插件才会有一些奇怪的图标,请忽略这些细微的不同)
在这里插入图片描述
然后插入刚刚找到的那三个文件的路径:
如果你mysql的版本和我的是一样的,就可以直接复制下面的代码,注意插入的位置

include_directories("/usr/local/mysql-8.0.23-macos10.15-x86_64/include")
include_directories("/usr/local/mysql-8.0.23-macos10.15-x86_64/lib")

target_link_libraries(这里写工程的名字 /usr/local/mysql-8.0.23-macos10.15-x86_64/lib/libmysqlclient.21.dylib)

后来发现写成下面这种方式也行,好像有个实际文件的硬链接

include_directories("/usr/local/mysql/include")
include_directories("/usr/local/mysql/lib")

target_link_libraries(这里写工程的名字 /usr/local/mysql/lib/libmysqlclient.21.dylib)

在这里插入图片描述

记得更新配置
在这里插入图片描述

然后在main.cpp文件里输入以下代码(啊…其实就是上面的删减版):
不过请注意一下:有些关于连接mysql的代码是需要修改成自己的,请看一下ConnectMysql()这个函数

#include <mysql.h>
#include <iostream>
#include <string>
//#include <bits/stdc++.h> mac原本是没有万能头的 需要安装mingw64才能使用这个文件
using namespace std;

bool ConnectMysql();//连接数据库
void FreeConnect();//释放资源

MYSQL mysql;
MYSQL_RES *res;//这个结构代表返回行的一个查询结果集
MYSQL_ROW column;//一个行数据的类型安全(type-safe)的表示

//测试代码
int main() {
    ConnectMysql();
    FreeConnect();
}

//连接数据库
bool ConnectMysql() {
    mysql_init(&mysql);//初始化mysql
    if (!(mysql_real_connect(&mysql,
                             "localhost",//主机
                             "root",//用户名
                             "",//密码
                             "myDatabase",//数据库名 必须是已经存在的 我的mysql大小写不敏感
                             3306,//端口号 默认的0或者3306
                             NULL, 0//最后两个参数的常用写法 几乎都是这两个
    ))) {
        cout << "Error connecting to database:" + (string) mysql_error(&mysql) << endl;
        return false;
    } else {
        cout << "Connected Successful..." << endl;
        return true;
    }
}

//释放资源
void FreeConnect() {
    mysql_free_result(res);
    mysql_close(&mysql);
    cout << "Free Successful" << endl;
}

然后就可以运行了

部分mac连接数据库中遇到的问题

fatal error: ‘mysql.h’ file not found

如果出现 fatal error: 'mysql.h' file not found报错,说明蓝标路径有问题下
在这里插入图片描述

ld: library not found for -lxxx

如果出现ld: library not found for -lxxx报错,这里的xxx就是下面红框里target_link_libraries的内容,一般根据每个人的写法不同而不同

as: ld: library not found for -llibmysqlclient,这里libmysqlclient的路径没有写完整,建议直接找到该文件的简介拷贝路径
在这里插入图片描述


ARM64

你要是出现arm64这种问题我就没办法解决了。。
有没有路过的大佬解决了稍微提点一下

感谢 typ maxval 的提示

基本上是搭载M1芯片的电脑会出现的问题 :安装MySql时需要下载MacMySQLARM版本
MySQL for Mac(M1)安装指南

未完待续…

  • 23
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值