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/
在這裏插入圖片描述
在這裏插入圖片描述
如果需要debug 可以下載下面 Debug Binaries & Test Suite
注: MySQL x86/x64與 Qt 編譯器一致: 例如: Qt5.12.1 + vs2015_x64 (高版本似乎不區分了)
在這裏插入圖片描述
如果無法打開和下載, 多刷新幾次, 如果還不行可能需要科學上網

安裝 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 (有使用期限) ->有一些科學使用方法自己百度琢磨.

在這裏插入圖片描述

# 啓動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 root@localhost = password('mysql'); 

解決 QMYSQL driver not loaded)

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

D:\Qt\QtVersion\Qt5.12.1\5.12.1\msvc2015_64\plugins\sqldrivers
2.把上面安裝的 libmysql.dll 也拷貝到你編譯後的[程序.exe] 相同路徑下在這裏插入圖片描述
最終:在這裏插入圖片描述
編譯運行 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 #關閉防火牆


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章