华为云征文|Flexus云服务X实例应用,通过QT连接华为云MySQL,进行数据库的操作,数据表的增删改查

在这里插入图片描述

引出


4核12G-100G-3M规格的Flexus X实例使用测评第3弹:Flexus云服务X实例应用,通过QT连接华为云MySQL,进行数据库的操作,数据表的增删改查

什么是Flexus云服务器X实例

官方解释:

Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器,可智能感知业务负载,适用于电商直播、企业建站、开发测试环境、游戏服务器、音视频服务等中低负载场景。相较于Flexus应用服务器L实例,Flexus云服务器X实例的优势包含:提供丰富的公共镜像、可灵活自定义vCPU内存配比、智能感知业务动态升降配,负载范围更高等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QT连接华为云MySQL

创建连接

通过QSqlDatabase设置和华为云数据库的连接,需要指定驱动,然后设置主机端口,数据库名称,用户名和密码

bool MainWindow::connectMySQL(){
    qDebug() << "\n======进行数据库的链接====";

    dbWeb = QSqlDatabase::addDatabase("QODBC"); // 使用 QMYSQL 驱动
    dbWeb.setHostName(""); // 云数据库的主机地址
    dbWeb.setPort(3306); // 端口
    dbWeb.setDatabaseName("huawei"); // 数据库名称
    dbWeb.setUserName("root"); // 用户名
    dbWeb.setPassword(""); // 密码

    if (!dbWeb.open()) {
        qDebug() << "Database error occurred:" << dbWeb.lastError().text();
        return false;
    }

    qDebug() << "连接成功";
    return true;
}

数据库操作和表创建

查询现有的数据库

查询现有的所有数据库,通过QT中提供的QSqlQuery进行查询

void MainWindow::queryDataBase(QSqlDatabase db){
    // 查询数据库的库
    qDebug() << "\n========查询库========";
    QSqlQuery query(db);
    if(query.exec("SHOW DATABASES")){
        while (query.next()) {
            QString databaseName = query.value(0).toString();
            qDebug() << "DB" << databaseName;
        }
    }else {
        qDebug() << "error:" << dbWeb.lastError().text();
    }
}

控制台打印出查询的结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建数据库

执行新建数据库的操作,通过query进行执行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

函数功能优化,支持输入数据库的名称进行新建数据库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void MainWindow::createDataBase(QSqlDatabase db, QString dbName){
    qDebug() << "\n=======创建数据库" << dbName << "=======";
    queryDataBase(db);

    // 新建数据库
    QSqlQuery query(db);
    QString q = "CREATE DATABASE IF NOT EXISTS " + dbName;
    if(!query.exec(q)){
        qDebug() << "error:" << db.lastError().text();
    }

    queryDataBase(db);
}

在库中创建表

在ODBC中设置数据库

首先在ODBC中编辑连接,选择DataBase为想要插入的表,选择Database下拉菜单,可以看到我们放个创建的数据表,这里选择example_db这个数据库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写代码执行,在数据库中创建一张新的表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

	    QSqlQuery query(db);
        QString createTableQuery = R"(CREATE TABLE IF NOT EXISTS Person (
            id INTEGER,
            name TEXT,
            age INTEGER
        ))";

        if (!query.exec(createTableQuery)) {
            qDebug() << "Error: Unable to create table." << query.lastError();
        }

数据表的操作–增删改查

数据增加插入

通过qt往华为云的数据库中插入数据,我们设置了主键自增,所以只需要传名字和年龄即可;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bool MainWindow::insertData(QSqlDatabase db,const QString &name,int age){
//    qDebug() << "\n========插入数据=======";
    QSqlQuery query(db);
    query.prepare("INSERT INTO Person (name, age) VALUES (:name, :age)");
    query.bindValue(":name", name);
    query.bindValue(":age", age);

    if (!query.exec()) {
        qDebug() << "Error: Unable to insert data into table 'Person'." << query.lastError();
        return false;
    }
    return true;
}

数据的删除

两种删除的方式:

1.通过id删除,通过数据表的主键进行删除,一次删除一个数据;

2.通过名字删除,会一次删除多行数据;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bool MainWindow::deleteByName(QSqlDatabase db, const QString &name){
    QSqlQuery query(db);

    query.prepare("DELETE FROM Person WHERE name = :name");
    query.bindValue(":name", name);

    if (!query.exec()) {
        qDebug() << "Error: Unable to delete data from table 'Person' by name." << query.lastError();
        return false;
    }

    return true;
}

bool MainWindow::deleteByID(QSqlDatabase db, int id){
    QSqlQuery query(db);

    query.prepare("DELETE FROM Person WHERE id = :id");
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to delete data from table 'Person' by id." << query.lastError();
        return false;
    }

    return true;
}

数据的修改

选择id为特定值的数据进行修改,可以同时修改名字和年龄,也可以只修改名字,或者只需改年龄;

如果年龄输入-1,则只修改名字

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果名字为空,则只修改年龄

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bool MainWindow::updateByID(QSqlDatabase db, int id, const QString &newName,int newAge){

    QSqlQuery query(db);

    // 构建更新SQL语句
    QString updateQuery = "UPDATE Person SET";
    bool nameToUpdate = !newName.isEmpty();
    bool ageToUpdate = newAge != -1;

    if (nameToUpdate) {
        updateQuery += " name = :name";
    }
    if (ageToUpdate) {
        if (nameToUpdate) {
            updateQuery += ",";
        }
        updateQuery += " age = :age";
    }
    updateQuery += " WHERE id = :id";

    query.prepare(updateQuery);

    if (nameToUpdate) {
        query.bindValue(":name", newName);
    }
    if (ageToUpdate) {
        query.bindValue(":age", newAge);
    }
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to update data in table 'Person' by id." << query.lastError();
        return false;
    }

    return true;

}

数据的查询

首先重写实体类的<< 方法,提供格式化输出函数,方便控制台打印查看

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QDebug operator<<(QDebug dbg, const Person &data) {
    dbg.nospace() << "person("
           << QString::number(data.id) << ","
           << data.name  << ","
           << QString::number(data.age)  << ")";
    return dbg.space();
}

根据ID查询单个

设置了主键自增,是唯一的,所有通过id查询,会查询到一个数据;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Person MainWindow::queryById(QSqlDatabase db, int id){
    QSqlQuery query(db);

    query.prepare("SELECT name, age FROM Person WHERE id = :id");
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to query data from table 'Person' by id." << query.lastError();
        return Person(-1,"",-1);
    }

    if (query.next()) {
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        return Person(id, name, age);
    }

    return Person(-1,"",-1);;
}

根据name查询多个

人员的名字会重复,一次性会查询出多个,所以用一个容器进行数据的接收。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.

// 根据名字查询多个
std::vector<Person> MainWindow::queryByName(QSqlDatabase db, const QString &name){
    QSqlQuery query(db);

    query.prepare("SELECT id, name, age FROM Person WHERE name = :name");
    query.bindValue(":name", name);

    std::vector<Person> persons;

    if (!query.exec()) {
        qDebug() << "Error: Unable to query data from table 'Person' by name." << query.lastError();
        return persons;
    }

    while (query.next()) {
        int id = query.value("id").toInt();
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        persons.emplace_back(id, name, age);
    }

    return persons;
}

总结

4核12G-100G-3M规格的Flexus X实例使用测评第3弹:Flexus云服务X实例应用,通过QT连接华为云MySQL,进行数据库的操作,数据表的增删改查

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值