MySQL数据库从win导出成_db.sql复制到linux

MySQL数据库下载后基本使用+增删改查语句模板_mysql增语句大全-CSDN博客

1.启动服务后,导出到指定文件

格式:mysqldump -u 用户名 -p 数据库名 > 输出路径\文件名.sql

bash 复制代码
mysqldump -u root -p log_db > D:\MySQL\mysql-8.0.34-winx64\dboutput\log_db.sql
验证:

2.修改mysqlutil.cpp mysqlutil.h

mysqlutil.cpp
cpp 复制代码
#include "mysqlutil.h"
#include "QDebug"
#include <QSqlRecord>
#include <QSqlError>
#include <QMessageBox>
#include <QFileInfo>  // 新增:处理文件路径

// 静态成员初始化
QSqlDatabase MySqlUtil::mDb = QSqlDatabase();  // 初始化为空,避免提前创建驱动
QMap<QString,QString> MySqlUtil::mMap;
QString MySqlUtil::mCurrentDriver = "";  // 新增:记录当前驱动类型

MySqlUtil *MySqlUtil::instance()
{
    static MySqlUtil instance;
    return &instance;
}

MySqlUtil::MySqlUtil(QObject *parent): QObject(parent)
{
    // 构造函数仅初始化,不提前创建驱动
}

MySqlUtil::~MySqlUtil()
{
    closeDb();
}

// 原有远程MySQL连接接口(完全保留,仅微调驱动创建逻辑)
bool MySqlUtil::connectDb(const QString &host, const QString &user, const QString &password, const QString &dbName, int port)
{
    if(mDb.isOpen()){
        mDb.close();
    }

    qDebug() << "=== 可用的数据库驱动列表 ===";
    QStringList drivers = QSqlDatabase::drivers();
    foreach (QString driver, drivers) {
        qDebug() << "驱动名称:" << driver;
    }

    // 重新创建MySQL驱动(避免复用SQLite驱动)
    if (mCurrentDriver != "QMYSQL") {
        mDb = QSqlDatabase::addDatabase("QMYSQL", "MySqlUtil");
        mCurrentDriver = "QMYSQL";
    }

    if(!mDb.isValid()){
        qDebug()<<"core_mysql mysqlutil.cpp 获取MySQL驱动失败";
        return false;
    }

    if (!drivers.contains("QMYSQL")) {
        QMessageBox::critical(nullptr, "错误", "Qt未找到MySQL驱动!");
        return false;
    } else {
        qDebug()<<"MySQL驱动加载成功";
    }

    mDb.setHostName(host);
    mDb.setUserName(user);
    mDb.setPassword(password);
    mDb.setDatabaseName(dbName);
    mDb.setPort(port);

    bool ret = mDb.open();
    if(!ret){
        qWarning() << "远程MySQL连接失败:" << mDb.lastError().text();
        return false;
    }

    qDebug() << "远程MySQL连接成功!";
    return true;
}

// 新增:本地数据库文件连接接口(支持绝对/相对路径)
bool MySqlUtil::connectLocalDb(const QString &dbFilePath)
{
    if(mDb.isOpen()){
        mDb.close();
    }

    // 解析路径:相对路径转绝对路径(确保兼容性)
    QFileInfo fileInfo(dbFilePath);
    QString absDbPath = fileInfo.absoluteFilePath();
    qDebug() << "本地数据库文件路径(绝对):" << absDbPath;

    // 重新创建SQLite驱动(避免复用MySQL驱动)
    if (mCurrentDriver != "QSQLITE") {
        mDb = QSqlDatabase::addDatabase("QSQLITE", "MySqlUtil");
        mCurrentDriver = "QSQLITE";
    }

    if(!mDb.isValid()){
        qDebug()<<"获取SQLite驱动失败,请检查Qt是否编译SQLite插件";
        return false;
    }

    // 设置本地数据库文件路径(不存在则自动创建)
    mDb.setDatabaseName(absDbPath);

    bool ret = mDb.open();
    if(!ret){
        qWarning() << "本地数据库连接失败:" << mDb.lastError().text();
        return false;
    }

    qDebug() << "本地数据库文件连接成功!";
    return true;
}

void MySqlUtil::closeDb()
{
    if(mDb.isOpen() && mDb.isValid()){
        mDb.close();
        QSqlDatabase::removeDatabase("MySqlUtil");
        mCurrentDriver = "";  // 重置驱动标记
        qInfo() << "[MySqlUtil] 数据库连接已关闭,连接名MySqlUtil已移除";
    } else if(mDb.isValid()){
        qInfo() << "[MySqlUtil] 数据库未打开,无需关闭";
    } else {
        qWarning() << "[MySqlUtil] 数据库驱动无效,无连接可关闭";
    }
}

QSqlQuery MySqlUtil::executeQuery(const QString &sql)
{
    if(!isConnected()){
        qDebug()<<"数据库未连接";
        return QSqlQuery();
    }

    QSqlQuery query(mDb);
    if(!query.exec(sql)){
        qDebug()<<"查询失败:" << query.lastError().text();
        return QSqlQuery();
    }
    return query;
}

bool MySqlUtil::isConnected()
{
    return mDb.isOpen() && mDb.isValid();
}

QVariantList MySqlUtil::getQueryResult(const QString &sql)
{
    QVariantList resultList;

    if(!isConnected()){
        qDebug()<<"数据库没有连接";
        return resultList;
    }

    QSqlQuery query = executeQuery(sql);
    // 修复原代码的逻辑错误:query.isValid() 是判断当前行是否有效,不是查询是否失败
    if (query.lastError().isValid()) {
        qDebug() << "getQueryResult: 查询失败,错误信息:" << query.lastError().text();
        return resultList;
    }

    QSqlRecord record = query.record();
    int columnCount = record.count();
    if (columnCount <= 0) {
        qDebug() << "getQueryResult: 查询结果无有效列";
        return resultList;
    }

    while (query.next()) {
        QVariantMap rowMap;
        for (int i = 0; i < columnCount; ++i) {
            QString columnName = record.fieldName(i);
            QString chineseKey = mMap.value(columnName, columnName);
            QVariant value = query.value(i);
            rowMap[chineseKey] = value;
        }
        resultList.append(rowMap);
    }

    return resultList;
}

bool MySqlUtil::insertData(const QString &sql)
{
    QSqlQuery query = executeQuery(sql);
    bool success = !query.lastError().isValid();
    if (success) {
        qDebug() << "成功插入数据【MySQLUtil】,受影响行数:" << query.numRowsAffected();
    } else {
        qDebug() << "插入失败【MySQLUtil】,错误:" << query.lastError().text();
    }
    return success;
}

bool MySqlUtil::updateData(const QString &sql)
{
    QSqlQuery query = executeQuery(sql);
    bool success = !query.lastError().isValid();
    if (success) {
        qDebug() << "成功更新数据【MySQLUtil】,受影响行数:" << query.numRowsAffected();
    } else {
        qDebug() << "更新数据失败【MySQLUtil】,错误:" << query.lastError().text();
    }
    return success;
}

bool MySqlUtil::deleteData(const QString &sql)
{
    QSqlQuery query = executeQuery(sql);
    bool success = !query.lastError().isValid();
    if (success) {
        qDebug() << "成功删除数据【MySQLUtil】,受影响行数:" << query.numRowsAffected();
    } else {
        qDebug() << "删除数据失败【MySQLUtil】,错误:" << query.lastError().text();
    }
    return success;
}

QVariantMap MySqlUtil::getLatestTestData()
{
    QVariantMap resultMap;
    if(!isConnected()){
        qCritical() << "[MySqlUtil] 数据库未连接,无法查询test_table!";
        return resultMap;
    }

    QString sql = "SELECT * FROM test_table ORDER BY create_time DESC, id DESC LIMIT 1;";
    QSqlQuery query = executeQuery(sql);

    if (query.lastError().isValid()) {
        qCritical() << "[MySqlUtil] 查询test_table失败:" << query.lastError().text();
        return resultMap;
    }
    if (!query.next()) {
        qWarning() << "[MySqlUtil] test_table无任何数据,请先插入数据!";
        return resultMap;
    }

    QSqlRecord record = query.record();
    int columnCount = record.count();
    qInfo() << "[MySqlUtil] 查到test_table最新数据,开始解析:";
    for (int i = 0; i < columnCount; ++i) {
        QString columnName = record.fieldName(i);
        QVariant value = query.value(i);
        resultMap[columnName] = value;
        qInfo() << "  " << columnName << " = " << value << " (类型:" << value.typeName() << ")";
    }

    return resultMap;
}
mysqlutil.h
cpp 复制代码
#ifndef MYSQLUTIL_H
#define MYSQLUTIL_H

#include <QQmlEngine>
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMap>
#include <QVariantList>
#include <QVariantMap>

class MySqlUtil : public QObject
{
    Q_OBJECT
public:
    explicit MySqlUtil(QObject *parent = nullptr);
    ~MySqlUtil();

    Q_INVOKABLE QVariantList getQueryResult(const QString &sql);
    Q_INVOKABLE bool insertData(const QString &sql);  
    Q_INVOKABLE bool updateData(const QString &sql);  
    Q_INVOKABLE bool deleteData(const QString &sql);  
    Q_INVOKABLE QVariantMap getLatestTestData();

    // 原有远程MySQL连接接口(完全保留)
    Q_INVOKABLE bool connectDb(const QString& host,
                               const QString& user,
                               const QString& password,
                               const QString& dbName,
                               int port = 3306);

    // 新增:本地数据库文件连接接口(SQLite,兼容绝对/相对路径)
    Q_INVOKABLE bool connectLocalDb(const QString &dbFilePath);

    Q_INVOKABLE void closeDb();
    Q_INVOKABLE bool isConnected();

    static MySqlUtil* instance();

private:
    static QSqlDatabase mDb;
    static QMap<QString, QString> mMap;
    QSqlQuery executeQuery(const QString &sql);
    // 新增:标记当前连接类型(避免驱动冲突)
    static QString mCurrentDriver;
};

#endif // MYSQLUTIL_H

3.使用方法

模式 1:远程 MySQL 连接(原有功能,完全不变)

cpp 复制代码
// C++中调用
MySqlUtil::instance()->connectDb("192.168.1.100", "root", "123456", "log_db", 3306);
// 执行查询(和原来一样)
QVariantList result = MySqlUtil::instance()->getQueryResult("SELECT * FROM test_table");

// QML中调用
MySqlUtil.instance.connectDb("192.168.1.100", "root", "123456", "log_db", 3306)
let result = MySqlUtil.instance.getQueryResult("SELECT * FROM test_table")

模式 2:本地数据库文件连接(新增功能)

  1. 绝对路径(比如你的截图路径)
cpp 复制代码
// C++中调用(绝对路径)
MySqlUtil::instance()->connectLocalDb("D:/MySQL/mysql-8.0.34-winx64/dboutput/log_db.db");

// QML中调用(注意路径转义,或用file://协议)
MySqlUtil.instance.connectLocalDb("D:/MySQL/mysql-8.0.34-winx64/dboutput/log_db.db")
// 或
MySqlUtil.instance.connectLocalDb("file:///D:/MySQL/mysql-8.0.34-winx64/dboutput/log_db.db")
  1. 相对路径(和可执行文件同目录)
cpp 复制代码
// C++中调用(相对路径,自动转为可执行文件同级目录)
MySqlUtil::instance()->connectLocalDb("./log_db.db");  // 可执行文件同目录
// 或
MySqlUtil::instance()->connectLocalDb("db/log_db.db"); // 可执行文件同级的db子目录

// QML中调用
MySqlUtil.instance.connectLocalDb("./log_db.db")
相关推荐
知识分享小能手2 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 (Windows) 安装与核心语法实战指南(2)
数据库·学习·postgresql
清水白石0082 小时前
模板方法模式全解析:用抽象基类定义算法骨架,让子类优雅填充细节
数据库·python·算法·模板方法模式
@insist1232 小时前
软考-数据库系统工程师-计算机存储层次结构与性能优化核心知识点
大数据·jvm·数据库
脱发的老袁2 小时前
【数据库】Oracle手动清理归档日志
数据库·oracle
ZPC82102 小时前
docker 入门2
java·linux·数据库
beijingliushao2 小时前
03-数据库和数据表的基本操作
数据库
xiaoliuliu123452 小时前
treeNMS-1.7.5部署步骤详解(附Java环境准备与数据库配置)
java·开发语言·数据库
数据知道2 小时前
MongoDB 更新操作符 `$set` 与 `$unset`:精准修改字段与删除字段
数据库·mongodb
数据知道2 小时前
MongoDB 数值更新原子操作:`$inc` 实现点赞、计数器等高并发原子操作
数据库·算法·mongodb