技巧: macOs下Qt的Mysql驱动处理

网上的解决方案太烂,我自己写了一个,适用于mac平台。

问题描述

qt 连接数据库会有驱动问题,特别是三方数据库。
先已经确定了远端数据库可以以 root 身份连接,但是依然报错:QMYSQL driver not loaded

网上有很多参考文章,不过我没有尝试:

  • 我的数据库在区域网内的 NAS 上, 不想装本地数据库
  • 他们的解答没有条理,主要是没有分析;给的解决方案可想而知

分析并解决

分析

驱动错误就先到驱动目录: Qt安装目录/具体版本目录/clang_64/plugins/sqldrivers

依旧是说,它以来 libmysqlclient, 显然我没有安装, 去官网下载

1
2
Connector/C (libmysqlclient)
mysql-connector-c-6.1.11-macos10.12-x86_64.dmg

发现他安装在了: /usr/local/mysql-connector-c-6.1.11-macos10.12-x86_64/lib

然后查看了一下,发现还是缺依赖:

分析结果:发现实际依赖的最终是 mysql 的一个库

解决

安装mysql(我是只安装,但不实用本地数据库; 我有专门的远程数据库)

官网下载 mysql-5.7.17-macos10.12-x86_64.dmg

安装之后会为 root 设置一个默认的密码,不用管也没事儿。找到系统偏好设置, 先不要启动,先修改密码:

1
2
## 启动mysql但可以不用密码就登录
$ sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables

新开一个 shell 窗口, 修改密码 (如果知道密码直接通过 mysqladmin -u root -p password newpass)

1
2
3
4
5
6
7
8
## 确保 mysql 命令可以使用
$ which mysql // usr/lcoal/mysql/bin/mysql
$ mysql //如果/usr/local/mysql不在环境变量中, 添加一下或者切换到目录(以后就可以命令行操作了)
$ mysql> use mysql
$ mysql> flush privileges; //刷新 MySql 系统权限表
$ mysql> set password for 'root'@'localhost'=password('root') //我把密码修改为root
$ mysql> quit
$ sudo /usr/local/mysql/support-files/mysql.server stop //如果这里不关闭,通过设置关闭会出问题

然后启动连接试试看:

说明现在 mysql 安装正常, 现在直接做个软连接,满足 qt mysql 驱动插件的依赖即可:

1
sudo ln -fs /usr/local/mysql/lib/libmysqlclient.20.dylib /opt/local/lib/mysql55/mysql/libmysqlclient.18.dylib

具体指令过程如下图:

然后再试试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
//测试 mysql 驱动是否正常
QSqlDatabase database = QSqlDatabase::addDatabase("QMYSQL");
database.setHostName("192.168.10.103");
database.setPort(3306);
database.setUserName("root");
database.setPassword("admin");

database.setDatabaseName("test"); //这个库是存在的
if (database.open()) {
qDebug() << "连接 NAS 数据库成功";
} else {
qDebug() << "连接 NAS 数据库失败";
}

运行结果是: 连接 NAS 数据库成功

总结并补充

我解决的时候并没有改变 qt mysql插件的依赖目录,我觉得可能其版本的 qt库也会这么依赖。

mysql 还有一些其他问题, 比如UninstallPKG软件卸载, tcp连接问题(套接字配置问题), 启动问题等
列举如下:

1
2
3
4
5
$ sudo /usr/local/MySQL/support-files/mysql.server start
//停止mysql
$ sudo /usr/local/mysql/support-files/mysql.server stop
//重启mysql
$ sudo /usr/local/mysql/support-files/mysql.server restart

套接字问题: Connect to MySql error: "Can't connect to local MySQL server through socket
可能需要改变一下, localhost 为 IP 地址.

MySQL 的套接字(socket)文件默认路径是 /tmp/mysql.sock
但是有时候连接需要的却是 /var/mysql/mysql.sock ,这就导致了很多程序建立 MySQL 连接时提示找不到文件的错误。

1
2
3
4
5
6
## Message:     mysqli::real_connect(): (HY000/2002): No such file or directory
$ cd /var
$ sudo mkdir mysql
$ sudo chmod 755 mysql
$ cd mysql
$ sudo ln -s /tmp/mysql.sock mysql.sock
文章目录
  1. 1. 问题描述
  2. 2. 分析并解决
    1. 2.1. 分析
    2. 2.2. 解决
  3. 3. 总结并补充
|