如何在 Qt 中设置嵌入式 MySQL 客户端
Posted
技术标签:
【中文标题】如何在 Qt 中设置嵌入式 MySQL 客户端【英文标题】:How do I set up a embedded MySQL client in Qt 【发布时间】:2016-12-22 05:39:44 【问题描述】:我正在尝试将我的 embedded Linux
机器设置为 mysql 客户端,以便连接到外部 MySQL
服务器(在远程机器上运行)。 sqlite
不是一个选项。
我明白了,感谢Basile Starynkevitch,我必须使用libmysqlclient
(因为这是唯一一个运行这种连接并在客户端处理 MySQL 客户端/服务器协议的库)。
Qt 统计:
您需要 MySQL 头文件以及共享库 libmysqlclient.so。根据您的 Linux 发行版,您可能需要 安装一个通常称为“mysql-devel”的包。
有人这样做并且可以指出正确的包裹吗?
【问题讨论】:
在你的情况下考虑使用sqlite。 为什么需要使用已弃用的libmysqld
(不再受支持)?你应该解释一下。或者为什么不能在嵌入式 Linux 系统中启动mysqld
进程?
如果你需要连接到一些external MySQL服务器(运行在remote机器上)你必须使用libmysqlclient
;它是唯一知道连接到 external mysqld
的协议的库。换句话说,您应该编辑您的问题来解释“外部 MySQL 服务器”是什么意思(因为 libmysqld
不使用任何 外部 服务器)跨度>
【参考方案1】:
是的,假设您要做的是使用 QtSql API 访问 MySQL 数据库,而无需连接到外部 MySQL 服务器。使用嵌入式服务器库,服务器在与客户端 Qt 应用程序相同的进程中运行,类似于 SQLite 的工作方式。
但有一个警告:libmysqld 嵌入式服务器库自 MySQL 5.7.17 起已弃用,并将在 MySQL 8.0 中删除。 (如http://dev.mysql.com/doc/refman/5.7/en/libmysqld.html 中提到的)
【讨论】:
【参考方案2】:您的问题令人困惑,似乎自相矛盾。
您要么希望使用外部 MySQL 服务器,这意味着您的应用程序打开一个(tcp(7) 套接字)连接到某个运行mysqld
的远程机器。然后你必须使用libmysqlclient
(因为这是唯一运行这种连接并在客户端处理MySQL client/server protocol的库)。
如果mysqld
服务器在同一个嵌入式Linux 系统上作为不同的进程运行,你应该有一些方法来启动它(可能作为@的一部分) 987654329@ 脚本)。然后你仍然使用与它的套接字通信,你仍然需要libmysqlclient
。与运行mysqld
的远程机器的可能区别可能是(但我不确定)套接字系列。在连接到同一台机器上的服务器的特殊情况下,libmysqlclient
可能正在使用unix(7) 套接字。
或者您不想要任何外部服务器。您可能会考虑libmysqld
,但作为Romain answered,它已被弃用并且不受支持(所以我觉得这将是一个非常糟糕的选择)。然后所有的数据库代码都在你的嵌入式 Linux 计算机上运行,它也有所有的数据存储。在这种情况下(关系数据库、数据和存储在同一台嵌入式 Linux 计算机上),我建议改用 sqlite,因为它得到了很好的支持并且非常稳定。
如果您的mysqld
守护程序在远程机器上运行,您无法(实际上)避免使用libmysqlclient
(否则您将需要重写大部分内容)。
【讨论】:
【参考方案3】:我最终做了以下事情:
在我的嵌入式 Linux 上安装 MySQL 并使用它进行测试
mysql --host=1.2.3.4 --user=Foo --password=FooPass testdb
当 MySQL 服务器在 1.2.3.4 上运行时。
我用-sql-mysql
选项重新编译了Qt,所以新编译的版本将包含Qt MySQL插件。
用下面的代码测试是否支持 Qt MySQL 插件:
QStringList driverslist = QSqlDatabase::drivers();
QString str;
foreach (str, driverslist) qDebug() << str
预期输出是:
QMYSQL3
QMYSQL
使用下一个代码测试该驱动程序是否按预期加载:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("1.2.3.4");
db.setDatabaseName("TestDB");
db.setUserName("Foo");
db.setPassword("FooPass");
bool ok = db.open();
if(ok)
// "Connected"
【讨论】:
以上是关于如何在 Qt 中设置嵌入式 MySQL 客户端的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2010 中设置 Qt 路径?