Operación QT base de datos Mysql en Ubuntu

Este artículo resume cómo operar la base de datos Mysql con QT en Ubuntu.

Tabla de contenido

1. Inicie el servidor de base de datos Mysql.

2. Verifique los controladores de bases de datos compatibles con QT

3. Conéctese a la base de datos

4. Agregar tablas y registros

5. Eliminar registros

6. Modificar registros

7. Consultar registros

8. Código completo y resultados en ejecución.

Resumen de errores comunes:

(1) El servicio de base de datos no se inicia y se informa un mensaje de error

(2) Hay un controlador QMYSQL, pero faltan datos de conexión y falla.


1. Inicie el servidor de base de datos Mysql.

// puesta en marcha

sudo /etc/init.d/mysql inicio

// Reanudar

sudo /etc/init.d/mysql reiniciar

// cierre

sudo /etc/init.d/mysql detener

2. Verifique los controladores de bases de datos compatibles con QT

El módulo Qt SQL es una interfaz proporcionada por Qt para acceder a la base de datos. Admite el uso de diferentes tipos de bases de datos en múltiples plataformas. En este proceso, el controlador de la base de datos juega un papel importante. Es responsable de comunicarse con diferentes bases de datos. Los Drivers de bases de datos nos permiten utilizar diferentes tipos de bases de datos.

#include <QtSql/QSqlDatabase> 

// Ver controladores de bases de datos compatibles 
qDebug() << QSqlDatabase::drivers();

3. Conéctese a la base de datos

QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection")) {
	db = QSqlDatabase::database("qt_sql_default_connection");
}
else {
	// 创建一个数据库连接,指定数据库驱动
	db = QSqlDatabase::addDatabase("QMYSQL");
}

// 数据库连接需要设置的信息
db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
db.setDatabaseName("TestDB");// 数据库名
db.setUserName("root");// 用户名
db.setPassword("mysql");// 密码
db.setPort(3306);// 端口号

// 连接数据库
bool ok = db.open();

if (ok) {
	qDebug() << "连接成功";
}
else {
	qDebug() << "连接失败";
}

4. Agregar tablas y registros

// 实例化QSqlQuery,用于执行sql语句
QSqlQuery query(m_db);
// 创建一个表
query.exec("create table newUser (id int primary key, username varchar(20))");
QSqlQuery query(m_db);
query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");

int userid = 2;
QString &&name = "张三";
query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
query.bindValue(":id", userid);
query.bindValue(":username", name);
query.exec();

query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");

5. Eliminar registros

QSqlQuery query(m_db);
query.prepare("DELETE FROM newUser WHERE username=:username");
query.bindValue(":username", "张三");
query.exec();

6. Modificar registros

QSqlQuery query(m_db);
query.prepare("update newUser set username=:username WHERE id=:id");
query.bindValue(":id", 1);
query.bindValue(":username", "World");
query.exec();

7. Consultar registros

  // 查询所有
  QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(m_db);                               // [1] 传入数据库连接
    query.exec(sql);                                   // [2] 执行sql语句
    while (query.next()) {                             // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());
    }

    // 查询指定记录
    QString username = "李四";
    sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    query.exec(sql);        // [2] 执行sql语句
    while (query.next()) {  // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }

    // 绑定数据查询
    username = "张三";
    sql = "SELECT * FROM newUser WHERE username=:username";
    query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
    query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    query.exec();                           // [4] 执行数据库操作
    while (query.next()) {                  // [5] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }

8. Código completo y resultados en ejecución.

qt_mysql.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-05T23:12:20
#
#-------------------------------------------------

QT       += core gui
QT += sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qt_mysql
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

ventana principal.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSql/QSqlDatabase>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_clear_table_clicked();

private:
    void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
    QSqlDatabase getConnectionByName(const QString &connectionName);  // 使用自定义 connectionName 获取连接

private:
    Ui::MainWindow *ui;
    QSqlDatabase m_db;
};

#endif // MAINWINDOW_H

ventana principal.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>

/*
Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,
数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。

*/

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建名为 firstMysqlConnect 的数据库连接
    createConnectionByName("firstMysqlConnect");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    // 查看支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
}

//使用自定义 connectionName 创建连接
void MainWindow::createConnectionByName(const QString &connectionName){

    m_db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
    // 数据库连接需要设置的信息
    m_db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    m_db.setDatabaseName("TestDB");// 数据库名
    m_db.setUserName("root");// 用户名
    m_db.setPassword("mysql");// 密码
    m_db.setPort(3306);// 端口号

    // 连接数据库判断
    bool ok = m_db.open();

    if (ok){
        qDebug() << "连接成功";
    } else {
        qDebug() << "连接失败";
    }

}

// 使用自定义 connectionName 获取连接
QSqlDatabase MainWindow::getConnectionByName(const QString &connectionName) {
    // 获取数据库连接
    return QSqlDatabase::database(connectionName);
}

void MainWindow::on_pushButton_2_clicked()
{
    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection")) {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
    else {
        // 创建一个数据库连接,指定数据库驱动
        db = QSqlDatabase::addDatabase("QMYSQL");
    }

    // 数据库连接需要设置的信息
    db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    db.setDatabaseName("TestDB");// 数据库名
    db.setUserName("root");// 用户名
    db.setPassword("mysql");// 密码
    db.setPort(3306);// 端口号

    // 连接数据库
    bool ok = db.open();

    if (ok) {
        qDebug() << "连接成功";
    }
    else {
        qDebug() << "连接失败";
    }
}

void MainWindow::on_pushButton_3_clicked()
{
    // 实例化QSqlQuery,用于执行sql语句
    QSqlQuery query(m_db);
    // 创建一个表
    query.exec("create table newUser (id int primary key, username varchar(20))");
}

void MainWindow::on_pushButton_4_clicked()
{
    QSqlQuery query(m_db);
    query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");

    int userid = 2;
    QString &&name = "张三";
    query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    query.bindValue(":id", userid);
    query.bindValue(":username", name);
    query.exec();

    query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
    query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");
}

void MainWindow::on_pushButton_5_clicked()
{
    QSqlQuery query(m_db);
    query.prepare("DELETE FROM newUser WHERE username=:username");
    query.bindValue(":username", "张三");
    query.exec();
}

void MainWindow::on_pushButton_6_clicked()
{
    QSqlQuery query(m_db);
    query.prepare("update newUser set username=:username WHERE id=:id");
    query.bindValue(":id", 1);
    query.bindValue(":username", "World");
    query.exec();
}

void MainWindow::on_pushButton_7_clicked()
{
    // 查询所有
    QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(m_db);                               // [1] 传入数据库连接
    query.exec(sql);                                   // [2] 执行sql语句
    while (query.next()) {                             // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());
    }

    // 查询指定记录
    QString username = "李四";
    sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    query.exec(sql);        // [2] 执行sql语句
    while (query.next()) {  // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }

    // 绑定数据查询
    username = "张三";
    sql = "SELECT * FROM newUser WHERE username=:username";
    query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
    query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    query.exec();                           // [4] 执行数据库操作
    while (query.next()) {                  // [5] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }
}

void MainWindow::on_pushButton_clear_table_clicked()
{
    QSqlQuery query(m_db);
    query.exec("DELETE FROM newUser");
}

principal.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

ventana principal.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>693</width>
    <height>412</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>查看数据库驱动</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QPushButton" name="pushButton_2">
      <property name="text">
       <string>连接mysql数据库</string>
      </property>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QPushButton" name="pushButton_3">
      <property name="text">
       <string>创建表</string>
      </property>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QPushButton" name="pushButton_4">
      <property name="text">
       <string>插入记录</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QPushButton" name="pushButton_5">
      <property name="text">
       <string>删除记录</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QPushButton" name="pushButton_6">
      <property name="text">
       <string>修改记录</string>
      </property>
     </widget>
    </item>
    <item row="3" column="0">
     <widget class="QPushButton" name="pushButton_7">
      <property name="text">
       <string>查询记录</string>
      </property>
     </widget>
    </item>
    <item row="3" column="1">
     <widget class="QPushButton" name="pushButton_clear_table">
      <property name="text">
       <string>删除表中所有数据</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>693</width>
     <height>39</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

Resumen de errores comunes:

(1) El servicio de base de datos no se inicia y se informa un mensaje de error

(2) Hay un controlador QMYSQL, pero faltan datos de conexión y falla.

Motivo: Qt encapsula Mysql y el nombre de la biblioteca es libqsqlmysql.so, pero también necesita llamar a la biblioteca cliente Mysql para conectarse realmente a la base de datos. Como puede ver a continuación, libqsqlmysql.so debe depender de libmysqlclient.so.18 .

Supongo que te gusta

Origin blog.csdn.net/hsy12342611/article/details/132717677
Recomendado
Clasificación