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] 相同路徑下
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 #關閉防火牆