天天看點

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

Qt 使用 MySQL

    • 下載下傳 MySQL
    • 安裝 MySQL 建立建資料庫
    • 解決 QMYSQL driver not loaded)
    • 解決 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
    • 解決 QSqlDatabasePrivate::removeDatabase: connection 'XXX' is still in use, all queries will cease to work
  • Ubuntu18.04 編譯 Qt mysql 插件驅動

Qt 5.12.4 版本出現請參考:https://blog.csdn.net/u013894391/article/details/95097583

Qt 5.12.4 沒有這玩意: qsqlmysql.dll 請換版本或者自己編譯.

下載下傳 MySQL

MySQL下載下傳位址: https://dev.mysql.com/downloads/

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動
Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

如果需要debug 可以下載下傳下面 Debug Binaries & Test Suite

注: MySQL x86/x64與 Qt 編譯器一緻: 例如: Qt5.12.1 + vs2015_x64 (高版本似乎不區分了)

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

如果無法打開和下載下傳, 多重新整理幾次, 如果還不行可能需要科學上網

安裝 MySQL 建立建資料庫

1.将解壓後的 mysql-8.0.18-winx64 的 bin 路徑配置到系統環境變量path中(如何配置環境變量可以百度);

2.在解壓後的 mysql-8.0.18-winx64 檔案夾中建立 data 檔案夾;

3.在 mysql-8.0.18-winx64 檔案中建立 my.ini 檔案内容如下

[client]
port=3306
default-character-set=utf8
[mysqld] 
# 設定為自己MYSQL的安裝目錄 
basedir=D:\mysql-8.0.18-winx64   #為你 mysql-8.0.18-winx64 檔案夾實際路徑
# 設定為MYSQL的資料目錄 
datadir=D:\mysql-8.0.18-winx64\data #第2步驟建立的 data 檔案夾路徑
port=3306
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
#開啟查詢緩存
explicit_defaults_for_timestamp=true
skip-grant-tables
           

4、進行以上必要的URL配置後,一定以管理者身份運作 cmd ,使用以下指令進行 MySQL 的初始化、安裝、啟動、建資料庫等操作;

mysql -V  
#回車出現 Welcome to the MySQL monitor.  Commands end with ; or \g.
#Your MySQL connection id is 67
#Server version: 58.0.18 MySQL Community Server (GPL)  
#表示你的 mysql 環境變量添加正确,反之檢查自己 mysql 的環境變量吧
 
mysqld --initialize

mysqld -install  
#執行成功後,再執行一次可以看到安裝位置(有時候對于電腦已有mysql容易查找删除)
#删除服務(管理者權限啟動):sc delete MySQL

net start mysql
mysql -u root -p mysql
mysql> create database yeHai; #建立資料名稱   注:sql語句結尾處要加 ";"
mysql> show database;        #檢視已建立的資料庫, 步驟可省略
           

也可以使用一些可視化工具來檢視建立的資料庫:

例如: Navicat Premium 12 (有使用期限) ->有一些科學使用方法自己百度琢磨.

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動
# 啟動MySQL服務
    net start mysql
# 關閉MySQL服務
    net stop mysql
    
##用SET PASSWORD指令 修改資料庫密碼
#mysql> set password for 資料庫使用者名@localhost = password('新密碼'); 
mysql -u root -p # 連接配接MySQL伺服器
mysql> set password for [email protected] = password('mysql'); 

           

解決 QMYSQL driver not loaded)

1.找到你正在使用 Qt 的 sqldrivers 檔案夾把它拷貝到 你編譯後的[程式.exe] 相同路徑下

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

2.把上面安裝的 libmysql.dll 也拷貝到你編譯後的[程式.exe] 相同路徑下

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

最終:

Qt MySQLUbuntu18.04 編譯 Qt mysql 插件驅動

編譯運作 Qt 大功告成, 如果還提示, 請檢查你的 libmysql.dll 是不是從資料庫中拷貝出來的. 不要亂用别人的 libmysql.dll. 資料庫和 Qt 要使用同一版本的 libmysql.dll

sorry, 再說2句,對直接拷貝到 D:\Qt\QtVersion\Qt5.12.1\5.12.1\msvc2015_64\bin 路徑下的行為隻能仁者見仁智者見智了. 本人是不喜歡往這裡放東西, 多人協作時同步 git 代碼怎麼辦, 人肉廣播一下,所有 Qter 都要放?

解決 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

Qt不同版本間移植時會出現這個錯誤,由跨線程造成的, 線上程中重新連接配接一次MySQL即可

//建立一個QMYSQL資料庫連接配接
bool SqlClass::createMySQLConnection(const QString & hostName,
                                     int port,
                                     const QString &userName,
                                     const QString &password,
                                     const QString &dataBaseName)
{
    _connectionName = dataBaseName;
    //fileInfo.completeBaseName() 資料庫的檔案名,來作為連接配接名(如果多個db名字一緻,則修改此處)
    QSqlDatabase db  = QSqlDatabase::database(_connectionName);
    
    if(!db.isValid()){ //如果db不可用,則添加
        db = QSqlDatabase::addDatabase("QMYSQL", _connectionName);
        db.setHostName(hostName);
        db.setPort(port);
        db.setUserName(userName);
        db.setPassword(password);
        db.setDatabaseName(dataBaseName);
    }
    if( !db.open()){ //判斷db是否已經打開
        setErrorString(tr("db not open: %1:%2").arg(dataBaseName).arg(db.lastError().text()));
        return false;
    }
    return true;
}

QSqlDatabase  SqlClass::dbConnection()
{
    QSqlDatabase db = QSqlDatabase::database(_connectionName);
    if( !db.open()){ //判斷db是否已經打開
        if (!createMySQLConnection("localhost",3306, "root", "mysql", "user")) {
        //連接配接錯誤
        }
    }
    return (db = QSqlDatabase::database(_connectionName));
}

/** 查詢
 * @brief SqlClass::query
 * @param sqlStr
 * @return
 */
QVariantList SqlClass::queryList(const QString &sqlStr)
{
    QMutexLocker locker(&_mutex);
    QVariantList list;
    QSqlQuery query(dbConnection());
    
    if(!query.exec(sqlStr)){
        setErrorString(QString("%1:%2").arg(sqlStr).arg(query.lastError().text()));
        return list;
    }else{
        qDebug()<<__LINE__<<__FUNCTION__<<"sql ok:"<<sqlStr;
    }
    //列的個數
    int column = query.record().count();
    qDebug()<<__LINE__<<__FUNCTION__<<"column:"<<column;
    while(query.next()){
        QVariantMap map;
        for(int i=0; i<column; ++i){
            map.insert(QString::number(i),query.value(i));
        }
        list.append(map);
    }
    qDebug()<<__LINE__<<__FUNCTION__<<"list:"<<list<<list.size();
    query.clear();
    return list;
}
           

解決 QSqlDatabasePrivate::removeDatabase: connection ‘XXX’ is still in use, all queries will cease to work

SqlClass::~SqlClass()
{
    //之是以這麼寫,是為了消除警告
    //QSqlDatabasePrivate::removeDatabase: connection 'XXX' is still in use, all queries will cease to work
    QSqlDatabase dbTmp;
    dbTmp.database(_connectionName);
    if(dbTmp.isValid()){
        QSqlDatabase *db = &dbTmp;
        if(db->isOpen())
            db->close();
        QSqlDatabase::removeDatabase(_connectionName);
    }
}
           

Ubuntu18.04 編譯 Qt mysql 插件驅動

參考:https://blog.csdn.net/x85371169/article/details/79855728

#安裝
sudo apt-get install mysql-server
sudo apt-get install mysql-client   
sudo apt-get install libmysqlclient-dev 
#cd 到sqldrivers目錄下
cd /home/hu/Qt5.12.8/5.12.8/Src/qtbase/src/plugins/sqldrivers
qmake -- MYSQL_PREFIX=/user/local
make sub-mysql

#cd 到mysql.pro路徑下
cd /home/hu/Qt5.12.8/5.12.8/Src/qtbase/src/plugins/sqldrivers/mysql
sudo /home/hu/Qt5.12.8/5.12.8/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql"  "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient" mysql.pro

#最終會在 sqldrivers 目錄下生成 sqldrivers/plugins/sqldrivers/
libqsqlmysql.so   libqsqlmysql.so.debug
把 sqldrivers 檔案夾拷貝到 你的應用程式.exe目錄下即可
           
sudo service mysql status   #檢視mysql服務狀态
sudo service mysql start    #啟動服務
sudo service mysql stop     #停止服務
sudo service mysql restart  #重新開機服務

sudo apt-get install ufw #安裝防火牆
sudo ufw enable #打開防火牆
sudo ufw status #檢視防火牆狀态
sudo ufw disable #關閉防火牆