如何在 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 客户端的主要内容,如果未能解决你的问题,请参考以下文章