首页 > 数据库 >Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍

Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍

时间:2024-07-25 12:53:45浏览次数:12  
标签:SQLite Qt 数据库 数据表 模块 SQL 函数

文章目录

一、Qt SQL模块概述

  Qt SQL 模块提供数据库编程的支持,Qt 支持多种常见的数据库,如MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块包括多个类,可以实现数据库连接、SQL 语句执行、数据获取与界面显示等功能,数据与界面之间使用 Mode /View 架构,从而可以方便实现数据的界面显示操作。

  要在项目中使用 Qt SQL 模块,需要进行如下设置:

QT += sql
#include <QtSql>

这样会将 Qt SQL 模块中的所有类都包含进去 ,如果只使用其中的某些类 ,为避免冗余可以单独包含某个类。

1.Qt sql 支持的数据库

  Qt SQL 提供了一些常见数据库的驱动,包括网络型数据库,如 Oracle、MS SQL Server等,也包括简单的单机型数据库,如 SQLite。 Qt SQL 提供的数据库驱动如下:

image-20240722204753229

2.SQLite 数据库

  SQLite 是一种无需服务器、无需进行任何配置的数据库,所有的数据表、索引等数据库元素全都存储在一个文件里,在应用程序里使用 SQLite 数据库就完全可以当作一个文件来使用。SQLite是可以跨平台使用的数据库,在不同平台之间可以随意复制数据库。 SQLite 的驱动库文件很小,包含完整功能的驱动可以小到只有 500 KB。

  SQLite 是一种开源免费使用的数据库,可以从其官网下载最新版本的数据库驱动安装文件。

  SQLite Expert 是 SQLite 数据库可视化管理工具,可以从其官网下载最新的安装文件,SQLite Expert 安装文件带有 SQLite 数据库驱动,所以安装 SQLite Expert 后无需再下载安装 SQLite 数据库驱动。

  在 SQLite Expert 软件里建立一个数据库demodb.db,在此数据库里建立 4 个表。

   SQLite Expert 软件进行数据库字段设计的界面如下所示:

image-20240722211257838

  • employee 数据表是一个员工信息表

    employee 的字段定义如下:

    image-20240722211435705

    image-20240722211454798

    employee 数据表中数据如下:

    image-20240722211654511

  • departments 数据表是一个学员信息表,记录学院编号和学院名称。

    departments 的字段定义如下:

    image-20240722211556223

    departments 数据表中数据如下:

    image-20240722211738373

  • majors 数据表是专业信息表,记录各专业的信息

    majors 数据表的字段定义如下:

    image-20240722211837021

    departments 和 majors 构成 一个Master/Detail 关系数据表,majors 表里 departID 段记录了这个专业属于哪个学院, departments 表里的一条记录关联 majors 表中的多条记录。

    majors 数据表的数据如下:

    image-20240722212200438

  • studInfo 是一个记录学生信息的数据表。

    studInfo 数据表的字段定义如下:

    image-20240722212309203

    studlnfo 表中记录学生的所在学院采用了代码字段 departID,具体的学院名称需要通过查询departments 表中相同的 departID 的记录获得; majorID 记录了专业代码,具体的专业名称需要查找 majors 表中的记录获取。这两个字段都是代码字段,只存储代码,具体的意义需要查询关联数据表的相应记录获得,在实际的数据库设计中经常用到这种设计方式。

    Qt SQL 中使用 QSqlRelationalTableModel 可以很方便地实现这种代码型数据表的显示与编辑。

    studInfo 数据表的数据如下:

    image-20240722212637919

3.Qt SQL 模块的主要类

  Qt SQL 提供的主要类的简要功能描述如下:

image-20240722212943689

  • QSqlDatabase

      QSqlDatabase 类用于建立与数据库的连接, 一般是先加载需要的数据库驱动,然后设置数据库的登录参数,如主机地址、用户名、 登录密码等,如果是单机型数据库,如 SQLite,只需设置数据库文件即可。

  • 数据模型类:QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel

      数据库的操作一般需要将数据库的内容在界面上进行显示和编辑, Qt 采用 Model/View 结构进行数据库内容的界面显示。QTableView 是常用的数据库内容显示视图组件。用于数据库操作的数据模型类有 QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel,这几个类的继承关系:

    image-20240722213840666

    • QSqlQueryModel

        QSqlQueryModel 是 QSqlTableModel 的父类。QSqlQueryModel 封装了执行 SELECT 语句从数据库查询数据的功能。QSqlQueryModel 通过设置 SELECT 语句查询获取数据库的内容,但是 QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据

      QSqlQueryModel 类的主要接口函数为:

      image-20240723215120419

      使用 QSqlQueryModel 作为数据模型从数据库里查询数据,只需使用 setQuery() 函数设置一个 SELECT 查询语句即可。QSqlQueryModel 可以作为 QTableView 等视图组件的数据源,也可以使用 QDataWidgetMapper 创建字段与界面组件的映射,只是查询出来的数据是不可编辑的。

    • QSqlTableModel

        QSqlTableModel 直接设置一个数据表的名称,可以获取数据表的全部记录 ,其结果是可编辑的,设置为界面上的 QTableView 组件的数据模型后就可以显示和编辑数据。

      其主要的函数功能如下:

      image-20240723161034834

    • QSqIRelationalTableModel

        QSqIRelationalTableModel 是 QSqlTableModel 的子类。QSqIRelationalTableModel 可以处理关系数据表。所谓关系数据表,是指将主表里的某个字段存储为代码型字段,而代码字段的具体含义是在另一个数据表(代码表)里。QSqIRelationalTableModel 类专门用来编辑这种具有代码字段的数据表,可以很方便地将代码字段与关系数据表建立关系,在显示和编辑数据表时,直接使用关系表的代码意义字典的内容

        QSqIRelationalTableModel 类的主要函数与 QSqlTableModel 相同,有一个新函数 setRelation() 用于设置代码字段的关联数据表和关联字段

      函数定义如下:

      [virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
      
      • 参数 column 是主表中代码字段的序号

      • 参数 relation 是 QSqlRelation 类型的表示关联数据表的关系

        例如:

        tabModel->setRelation(3,QSqlRelation("departments","departID","department")); //学院
        
        • 第一个参数(数字3)是 departID 字段在 studInfo 表中的字段序号
        • 第二个参数用 QSqlRelation("departments","departID","department") 创建了一个 QSqlRelation 类对象,其中,参数"departments"指的是数据库中的代码表departments;参数"departID"是数据表中的代码字段名称;参数"department"是代码表中的代码意义字段名称。

      在数据库设计中使用代码字段和代码表的好处:

      • 一是可以减少数据表的存储量,一个大的数据表存储代码远比存储具体文字用的存储空间少;
      • 二是代码表示的文字可能会被修改 ,例如学院的名称可能会修改 ,这时只需修改代码表里一条记录而已。

    这些数据模型通常与 QTableView 组合成 Model/View 结构,实现通用的数据库表的管理功能。

  • QSqlQuery

      QSqlQuery 是能执行任意 SQL 语句的类,它可以执行任何 SQL 语句,如 SELECT、INSERT、UPDATE 、DELETE 等,通过 SQL 语句对数据库直接进行编辑修改。

    QSqlQuery 类的常用函数如下:

    image-20240724152749230

    • 使用 QSqlQuery 执行不带参数的 SQL 语句时可以用 exec(QString) 函数,如:

      QSqlQuery query;
      query.exec("SELECT * FROM employee");
      query.exec("UPDATE employee SET Salary=3000 where Gender='女'");
      
    • 使用 带参数的 SQL 语句时,先用 prepare() 函数准备 SQL 语句,然后用 bindValue() 函数设置参数值,再用 exec() 执行 SQL 语句。

      QSqlQuery query;
      query.prepare("SELECT * FROM employee where EmpNo=:ID");
      query.bindValue(":ID", 2003);
      query.exec();
      

      SQL 语句中的参数用 “冒号+参数名” 表示的形式,还可以直接用占位符来表示参数

      QSqlQuery query;
      query.prepare("UPDATE employee SET Name=?,Gender=?,Height=? where EmpNo=?");
      query.bindValue(0, "高某某");
      query.bindValue(1, "男");
      query.bindValue(2, 1.78);
      query.bindValue(3, 2010);
      query.exec();
      
  • QSqlRecord类:

      QSqlRecord 类记录了数据表的字段信息和一条记录的数据内容, QSqlTableModel 有两种参数的函数 record() 可以返回一条记录,分别是

    QSqlRecord QSqlTableModel::record() const
    QSqlRecord QSqlTableModel::record(int row) const
    
    • 不带参数的 record() 函数,返回的 QSqlRecord 对象只有记录的字段定义,但是没有数据。 这个函数一般用于获取一个数据表的字段定义。
    • 带参数的 record() 函数,返回行号为 row 的记录,包括记录的字段定义和数据。

    QSqlRecord 类封装了对记录的字段定义和数据的操作,其主要函数如下:

    image-20240723171602680

    QSqlRecord 用于字段操作的函数,一般有两种参数形式的同名函数,用字段序号或字段名表示一个字段 ,如 value() 函数返回一个字段的值,有如下两种参数形式的函数:

    • QVariant value(int index): 返回序号为 index 字段的值
    • QVariant value(QString &name):返回字段名称为 name 的字段的值
  • QSqlField

    QSqlField 封装了字段定义信息和数据。字段的定义一般在设计数据表时就固定了,不用在 QSqlRecord 里修改。QSqlRecord 的 fileld() 函数返回某个字段,返回的数据类型为QSqlField。QSqlField用于字段数据读写的函数如下:

    image-20240723172421273

  • QDataWidgetMapper

    QDataWidgetMapper 用于建立界面组件与数据模型之间的映射,可以将界面的 QLineEdit、QCombobox 等组件与数据模型的一个字段关联起来。当数据模型关联的字段内容发生变化时,自动更新组件的显示内容。

    其常用函数如下:

    • setModel() 函数–设置关联的数据模型

      void QDataWidgetMapper::setModel(QAbstractItemModel *model)
      

      用于设置 QDataWidgetMapper 将要使用的数据模型。参数 model 是一个指向 QAbstractItemModel 类型的指针

    • setSubmitPolicy() 函数–设置数据提交策略

      void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)
      

      其参数policy是一个枚举类型QDataWidgetMapper::SubmitPolicy。取值如下:

      • QDataWidgetMapper::AutoSubmit:自动,行切换时将自动提交修改。
      • QDataWidgetMapper::ManualSubmit:手动,需调用 submit() 方法,手工提交当前记录的修改。
    • addMapping() 函数 – 用于设置界面组件与数据模型的列的映射,这种映射关系使得控件的值可以与数据模型中的特定项关联起来

      void QDataWidgetMapper::addMapping(QWidget *widget, int section)
      

      参数 widget 是指向 UI 控件的指针,section 指定了数据模型中的列(如果方向是水平的)或行(如果方向是垂直的)

    • setCurrentIndex() 函数 – 将当前行数据映射到界面组件, 使界面上的编辑框、下拉列表框等与字段关联的界面组件显示当前记录的内容

      virtual void setCurrentIndex(int index)
      

      例如:

      dataMapper->setCurrentIndex(current.row()); //更新当前行数据映射
      
    • setCurrentModelIndex() 函数–当用户在视图中选择不同的行或列时,自动更新与之关联的表单或控件的数据。

      [slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)
      
    • revert() 和 submit() 函数用于手工取消或提交当前记录的修改。

    • toFirst()、toPrevious()、toNext() 和 toLast() 函数用于在记录间移动

      如:toFirst()函数用于移动到首记录

标签:SQLite,Qt,数据库,数据表,模块,SQL,函数
From: https://blog.csdn.net/zwcslj/article/details/140671587

相关文章

  • 记一次mysql生产误删表抢救操作
    背景数据库的操作必须要采取一系列的措施来规范流程和管理。然而,不同客户群体管理水平不一,删库跑路也并不是茶余饭后的笑话,它真真实实的,突如其来的就发生在你身边。接项目经理前线打来电话,某医院突发生产故障,通过业务日志得知,数据库缺表,需要紧急恢复数据,恢复生产。思路确认环......
  • 错误 1 error LNK2019: 无法解析的外部符号 _MQTTClient_create,该符号在函数 "protect
    前言全局说明错误1errorLNK2019:无法解析的外部符号_MQTTClient_create,该符号在函数"protected:virtualint__thiscallCmfc_mqttclientpoweronoffDlg::OnInitDialog(void)"(?OnInitDialog@Cmfc_mqttclientpoweronoffDlg@@MAEHXZ)中被引用一、说明环境:Windows1......
  • go对接mqtt
    在Go语言中对接MQTT服务,你可以使用 paho.mqtt.golang 这个库,这是一个EclipsePahoMQTT客户端的Go语言实现。以下是一些基本步骤和示例代码,帮助你开始使用Go语言对接MQTT服务。1. 安装MQTT客户端库:使用Go的包管理器安装 paho.mqtt.golang 库:gogetgithub.com/eclipse/......
  • 将非常大的数据插入 PostgreSQL 表的更好方法
    将非常大的数据插入PostgreSQL表的更好方法是什么?操作系统:Ubuntu22.04LTS数据库:PostgreSQL14框架:Python3.11Django现在我使用insertinto语句一次100,000行。平均插入1,000,000行整个过程需要2分钟,在我可以接受的范围内。但我想知道是否有更好的方法......
  • MySQL配置开发文章:学习路线、使用案例及代码示例
    引言MySQL是一个广泛使用的开源关系型数据库管理系统,由于其性能高、成本低、可靠性强,成为了许多开发者的首选工具,本文将介绍MySQL的基本配置、学习路线、使用案例及代码示例,帮助你更好地掌握MySQL的使用MySQL配置开发教程学习路线基础知识:了解关系型数据库的基本概念,熟......
  • SQLAlchemy 无法通过多对多关系中的外键找到引用的表
    我已经成功在我的数据库中添加了一个多对多关系。但是,当尝试添加另一个时,我遇到了:sqlalchemy.exc.NoReferencedTableError:Foreignkeyassociatedwithcolumn'user_shiftTemplate.template_id'couldnotfindtable'shifttemplate'withwhichtogenerateaforeig......
  • 免费分享一套微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端)【论文+源
    大家好,我是java1234_小锋老师,看到一个不错的微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端),分享下哈。项目介绍随着移动互联网技术的飞速发展和智能设备的普及,图书馆服务模式正在经历深刻的变革。本论文旨在探讨如何利用微信小程序这一便捷高效的平台,开发一款......
  • 如何使用 SQLite ?
    SQLite是一个轻量级、嵌入式的关系型数据库管理系统(RDBMS)。它是一种C库,实现了自给自足、无服务器、零配置、事务性SQL数据库引擎。SQLite的源代码是开放的,完全在公共领域。它被广泛用于各种应用程序,包括浏览器、操作系统、移动应用等。SQLite的基本特性轻量级:SQLite......
  • pyqt5-网易云热歌列表爬取
    利用pyqt5实现网易云热歌列表爬取简单思路说明:利用QScrollArea滚动显示,QFlowLayout做布局,放置自定义的WidgetQNetworkAccessManager异步下载网页和图片QScrollArea滚动到底部触发下一页加载自定义控件说明:主要是多个layout和控件的结合,其中图片QLabel为自定义,通过setPixmap......
  • 整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0
    一、环境准备1.环境准备:flink1.13.1+hudi0.10+hive2.1.1+cdh6.3.0+mysql5.7+flinkcdc2.1+flinkweb平台二.编译hudi(这个编译是以前的一个测试版本,编译大同小异)1.使用git命令下载hudi0.10的代码steven@wangyuxiangdeMacBook-Pro~gitclonehttps://github.com/ap......