• Ubuntu下QT操作Mysql数据库


    本篇总结一下一下Ubuntu下QT操作Mysql数据库。

    目录

    1. 启动Mysql数据库服务器

    2.查看QT支持的数据库驱动

    3.连接数据库

    4. 增加表和记录

    5. 删除记录

    6. 修改记录

    7. 查询记录

    8.完整代码和运行效果

    常见错误总结:

    (1) 数据库服务没启动报错信息

    (2) 有QMYSQL驱动,连接数据缺失败


    1. 启动Mysql数据库服务器

    // 启动

    sudo /etc/init.d/mysql start

    // 重启

    sudo /etc/init.d/mysql restart

    // 关闭

    sudo /etc/init.d/mysql stop

    2.查看QT支持的数据库驱动

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

    #include 
    
    // 查看支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
    

    3.连接数据库

    1. QSqlDatabase db;
    2. if(QSqlDatabase::contains("qt_sql_default_connection")) {
    3. db = QSqlDatabase::database("qt_sql_default_connection");
    4. }
    5. else {
    6. // 创建一个数据库连接,指定数据库驱动
    7. db = QSqlDatabase::addDatabase("QMYSQL");
    8. }
    9. // 数据库连接需要设置的信息
    10. db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    11. db.setDatabaseName("TestDB");// 数据库名
    12. db.setUserName("root");// 用户名
    13. db.setPassword("mysql");// 密码
    14. db.setPort(3306);// 端口号
    15. // 连接数据库
    16. bool ok = db.open();
    17. if (ok) {
    18. qDebug() << "连接成功";
    19. }
    20. else {
    21. qDebug() << "连接失败";
    22. }

    4. 增加表和记录

    1. // 实例化QSqlQuery,用于执行sql语句
    2. QSqlQuery query(m_db);
    3. // 创建一个表
    4. query.exec("create table newUser (id int primary key, username varchar(20))");
    1. QSqlQuery query(m_db);
    2. query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");
    3. int userid = 2;
    4. QString &&name = "张三";
    5. query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    6. query.bindValue(":id", userid);
    7. query.bindValue(":username", name);
    8. query.exec();
    9. query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
    10. query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");

    5. 删除记录

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

    6. 修改记录

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

    7. 查询记录

    1. // 查询所有
    2. QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    3. QSqlQuery query(m_db); // [1] 传入数据库连接
    4. query.exec(sql); // [2] 执行sql语句
    5. while (query.next()) { // [3] 遍历查询结果
    6. qDebug() << QString("Id: %1, Username: %2")
    7. .arg(query.value("id").toInt())
    8. .arg(query.value("username").toString());
    9. }
    10. // 查询指定记录
    11. QString username = "李四";
    12. sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    13. query.exec(sql); // [2] 执行sql语句
    14. while (query.next()) { // [3] 遍历查询结果
    15. qDebug() << QString("Id: %1, Username: %2")
    16. .arg(query.value("id").toInt())
    17. .arg(query.value("username").toString());
    18. }
    19. // 绑定数据查询
    20. username = "张三";
    21. sql = "SELECT * FROM newUser WHERE username=:username";
    22. query.prepare(sql); // [2] 使用名称绑定的方式解析 SQL 语句
    23. query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    24. query.exec(); // [4] 执行数据库操作
    25. while (query.next()) { // [5] 遍历查询结果
    26. qDebug() << QString("Id: %1, Username: %2")
    27. .arg(query.value("id").toInt())
    28. .arg(query.value("username").toString());
    29. }

    8.完整代码和运行效果

    qt_mysql.pro

    1. #-------------------------------------------------
    2. #
    3. # Project created by QtCreator 2023-09-05T23:12:20
    4. #
    5. #-------------------------------------------------
    6. QT += core gui
    7. QT += sql
    8. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    9. TARGET = qt_mysql
    10. TEMPLATE = app
    11. # The following define makes your compiler emit warnings if you use
    12. # any feature of Qt which as been marked as deprecated (the exact warnings
    13. # depend on your compiler). Please consult the documentation of the
    14. # deprecated API in order to know how to port your code away from it.
    15. DEFINES += QT_DEPRECATED_WARNINGS
    16. # You can also make your code fail to compile if you use deprecated APIs.
    17. # In order to do so, uncomment the following line.
    18. # You can also select to disable deprecated APIs only up to a certain version of Qt.
    19. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
    20. SOURCES += \
    21. main.cpp \
    22. mainwindow.cpp
    23. HEADERS += \
    24. mainwindow.h
    25. FORMS += \
    26. mainwindow.ui

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. namespace Ui {
    7. class MainWindow;
    8. }
    9. class MainWindow : public QMainWindow
    10. {
    11. Q_OBJECT
    12. public:
    13. explicit MainWindow(QWidget *parent = 0);
    14. ~MainWindow();
    15. private slots:
    16. void on_pushButton_clicked();
    17. void on_pushButton_2_clicked();
    18. void on_pushButton_3_clicked();
    19. void on_pushButton_4_clicked();
    20. void on_pushButton_5_clicked();
    21. void on_pushButton_6_clicked();
    22. void on_pushButton_7_clicked();
    23. void on_pushButton_clear_table_clicked();
    24. private:
    25. void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
    26. QSqlDatabase getConnectionByName(const QString &connectionName); // 使用自定义 connectionName 获取连接
    27. private:
    28. Ui::MainWindow *ui;
    29. QSqlDatabase m_db;
    30. };
    31. #endif // MAINWINDOW_H

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. /*
    5. Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,
    6. 数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。
    7. */
    8. MainWindow::MainWindow(QWidget *parent) :
    9. QMainWindow(parent),
    10. ui(new Ui::MainWindow)
    11. {
    12. ui->setupUi(this);
    13. // 创建名为 firstMysqlConnect 的数据库连接
    14. createConnectionByName("firstMysqlConnect");
    15. }
    16. MainWindow::~MainWindow()
    17. {
    18. delete ui;
    19. }
    20. void MainWindow::on_pushButton_clicked()
    21. {
    22. // 查看支持的数据库驱动
    23. qDebug() << QSqlDatabase::drivers();
    24. }
    25. //使用自定义 connectionName 创建连接
    26. void MainWindow::createConnectionByName(const QString &connectionName){
    27. m_db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
    28. // 数据库连接需要设置的信息
    29. m_db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    30. m_db.setDatabaseName("TestDB");// 数据库名
    31. m_db.setUserName("root");// 用户名
    32. m_db.setPassword("mysql");// 密码
    33. m_db.setPort(3306);// 端口号
    34. // 连接数据库判断
    35. bool ok = m_db.open();
    36. if (ok){
    37. qDebug() << "连接成功";
    38. } else {
    39. qDebug() << "连接失败";
    40. }
    41. }
    42. // 使用自定义 connectionName 获取连接
    43. QSqlDatabase MainWindow::getConnectionByName(const QString &connectionName) {
    44. // 获取数据库连接
    45. return QSqlDatabase::database(connectionName);
    46. }
    47. void MainWindow::on_pushButton_2_clicked()
    48. {
    49. QSqlDatabase db;
    50. if(QSqlDatabase::contains("qt_sql_default_connection")) {
    51. db = QSqlDatabase::database("qt_sql_default_connection");
    52. }
    53. else {
    54. // 创建一个数据库连接,指定数据库驱动
    55. db = QSqlDatabase::addDatabase("QMYSQL");
    56. }
    57. // 数据库连接需要设置的信息
    58. db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    59. db.setDatabaseName("TestDB");// 数据库名
    60. db.setUserName("root");// 用户名
    61. db.setPassword("mysql");// 密码
    62. db.setPort(3306);// 端口号
    63. // 连接数据库
    64. bool ok = db.open();
    65. if (ok) {
    66. qDebug() << "连接成功";
    67. }
    68. else {
    69. qDebug() << "连接失败";
    70. }
    71. }
    72. void MainWindow::on_pushButton_3_clicked()
    73. {
    74. // 实例化QSqlQuery,用于执行sql语句
    75. QSqlQuery query(m_db);
    76. // 创建一个表
    77. query.exec("create table newUser (id int primary key, username varchar(20))");
    78. }
    79. void MainWindow::on_pushButton_4_clicked()
    80. {
    81. QSqlQuery query(m_db);
    82. query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");
    83. int userid = 2;
    84. QString &&name = "张三";
    85. query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    86. query.bindValue(":id", userid);
    87. query.bindValue(":username", name);
    88. query.exec();
    89. query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
    90. query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");
    91. }
    92. void MainWindow::on_pushButton_5_clicked()
    93. {
    94. QSqlQuery query(m_db);
    95. query.prepare("DELETE FROM newUser WHERE username=:username");
    96. query.bindValue(":username", "张三");
    97. query.exec();
    98. }
    99. void MainWindow::on_pushButton_6_clicked()
    100. {
    101. QSqlQuery query(m_db);
    102. query.prepare("update newUser set username=:username WHERE id=:id");
    103. query.bindValue(":id", 1);
    104. query.bindValue(":username", "World");
    105. query.exec();
    106. }
    107. void MainWindow::on_pushButton_7_clicked()
    108. {
    109. // 查询所有
    110. QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    111. QSqlQuery query(m_db); // [1] 传入数据库连接
    112. query.exec(sql); // [2] 执行sql语句
    113. while (query.next()) { // [3] 遍历查询结果
    114. qDebug() << QString("Id: %1, Username: %2")
    115. .arg(query.value("id").toInt())
    116. .arg(query.value("username").toString());
    117. }
    118. // 查询指定记录
    119. QString username = "李四";
    120. sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    121. query.exec(sql); // [2] 执行sql语句
    122. while (query.next()) { // [3] 遍历查询结果
    123. qDebug() << QString("Id: %1, Username: %2")
    124. .arg(query.value("id").toInt())
    125. .arg(query.value("username").toString());
    126. }
    127. // 绑定数据查询
    128. username = "张三";
    129. sql = "SELECT * FROM newUser WHERE username=:username";
    130. query.prepare(sql); // [2] 使用名称绑定的方式解析 SQL 语句
    131. query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    132. query.exec(); // [4] 执行数据库操作
    133. while (query.next()) { // [5] 遍历查询结果
    134. qDebug() << QString("Id: %1, Username: %2")
    135. .arg(query.value("id").toInt())
    136. .arg(query.value("username").toString());
    137. }
    138. }
    139. void MainWindow::on_pushButton_clear_table_clicked()
    140. {
    141. QSqlQuery query(m_db);
    142. query.exec("DELETE FROM newUser");
    143. }

    main.cpp

    1. #include "mainwindow.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. MainWindow w;
    7. w.show();
    8. return a.exec();
    9. }

    mainwindow.ui

    1. "1.0" encoding="UTF-8"?>
    2. <ui version="4.0">
    3. <class>MainWindowclass>
    4. <widget class="QMainWindow" name="MainWindow">
    5. <property name="geometry">
    6. <rect>
    7. <x>0x>
    8. <y>0y>
    9. <width>693width>
    10. <height>412height>
    11. rect>
    12. property>
    13. <property name="windowTitle">
    14. <string>MainWindowstring>
    15. property>
    16. <widget class="QWidget" name="centralWidget">
    17. <layout class="QGridLayout" name="gridLayout">
    18. <item row="0" column="0">
    19. <widget class="QPushButton" name="pushButton">
    20. <property name="text">
    21. <string>查看数据库驱动string>
    22. property>
    23. widget>
    24. item>
    25. <item row="0" column="1">
    26. <widget class="QPushButton" name="pushButton_2">
    27. <property name="text">
    28. <string>连接mysql数据库string>
    29. property>
    30. widget>
    31. item>
    32. <item row="1" column="0">
    33. <widget class="QPushButton" name="pushButton_3">
    34. <property name="text">
    35. <string>创建表string>
    36. property>
    37. widget>
    38. item>
    39. <item row="1" column="1">
    40. <widget class="QPushButton" name="pushButton_4">
    41. <property name="text">
    42. <string>插入记录string>
    43. property>
    44. widget>
    45. item>
    46. <item row="2" column="0">
    47. <widget class="QPushButton" name="pushButton_5">
    48. <property name="text">
    49. <string>删除记录string>
    50. property>
    51. widget>
    52. item>
    53. <item row="2" column="1">
    54. <widget class="QPushButton" name="pushButton_6">
    55. <property name="text">
    56. <string>修改记录string>
    57. property>
    58. widget>
    59. item>
    60. <item row="3" column="0">
    61. <widget class="QPushButton" name="pushButton_7">
    62. <property name="text">
    63. <string>查询记录string>
    64. property>
    65. widget>
    66. item>
    67. <item row="3" column="1">
    68. <widget class="QPushButton" name="pushButton_clear_table">
    69. <property name="text">
    70. <string>删除表中所有数据string>
    71. property>
    72. widget>
    73. item>
    74. layout>
    75. widget>
    76. <widget class="QMenuBar" name="menuBar">
    77. <property name="geometry">
    78. <rect>
    79. <x>0x>
    80. <y>0y>
    81. <width>693width>
    82. <height>39height>
    83. rect>
    84. property>
    85. widget>
    86. <widget class="QToolBar" name="mainToolBar">
    87. <attribute name="toolBarArea">
    88. <enum>TopToolBarAreaenum>
    89. attribute>
    90. <attribute name="toolBarBreak">
    91. <bool>falsebool>
    92. attribute>
    93. widget>
    94. <widget class="QStatusBar" name="statusBar"/>
    95. widget>
    96. <layoutdefault spacing="6" margin="11"/>
    97. <resources/>
    98. <connections/>
    99. ui>

    常见错误总结:

    (1) 数据库服务没启动报错信息

    (2) 有QMYSQL驱动,连接数据缺失败

    原因:Qt对Mysql进行了封装,库名为libqsqlmysql.so,但是其还需要调用Mysql的客户端库才能真正连接数据库,如下可以看到libqsqlmysql.so需要依赖libmysqlclient.so.18。

  • 相关阅读:
    TypeScript系列之类型 void
    环形海尔贝克Halbach磁体阵列
    3种常见的数据脱敏方案
    Windows10安装redis(图文教程)
    Hamiton图系列文章 (2) Hamilton图道路矩阵类的乘法设计
    [NLP]LLM--使用LLama2进行离线推理
    LeetCode(力扣)416. 分割等和子集Python
    Aho-Corasick 算法 AC自动机实现
    【PCBA方案】快速测温体温计方案
    【第一阶段:java基础】第4章:java控制结构(P103-P154)
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/132717677