当前位置: 首页 > article >正文

QT ---------------数据库编程概要

1. QT数据库编程概要

1.1 简介

QT提供了强大的数据库编程支持,使得开发者可以方便地在应用程序中使用各种数据库。通过QT的数据库模块(QtSql),可以连接到多种数据库管理系统,如SQLite、MySQL、PostgreSQL等,并进行数据的查询、插入、更新和删除等操作。

1.2 基本步骤

  • 包含头文件:在使用QT数据库功能时,首先要包含相关的头文件,如<QtSql>
  • 驱动加载:根据要使用的数据库类型加载相应的数据库驱动。例如,对于SQLite,QT会自动加载其驱动。
  • 数据库连接:使用QSqlDatabase类来建立与数据库的连接,需要指定数据库名称、用户名、密码等连接参数(不同数据库这些参数有所不同)。
  • 执行SQL操作:可以通过QSqlQuery类来执行SQL语句,或者使用更高层次的模型类(如QSqlTableModelQSqlQueryModel)来操作数据。
  • 关闭连接:在操作完成后,需要关闭数据库连接以释放资源。

2. QtSql模块

2.1 功能概述

QtSql模块是QT中用于数据库操作的核心模块。它提供了一组类,用于处理数据库连接、SQL查询执行、数据模型表示等多种功能。

2.2 主要类

  • QSqlDatabase:用于建立和管理数据库连接。可以创建数据库连接对象,设置连接参数,打开和关闭连接等。
  • QSqlQuery:用于执行SQL语句。支持执行各种SQL操作,如SELECTINSERTUPDATEDELETE等,并且可以处理查询结果。
  • QSqlTableModel:提供了一个基于表格的数据模型,用于直接操作数据库中的表。可以方便地在视图(如QTableView)中显示和编辑表数据。
  • QSqlQueryModel:主要用于执行SQL查询并将结果作为数据模型提供给视图。适合执行自定义的SQL查询操作。

3. SQLite简述

3.1 特点

SQLite是一个轻量级的嵌入式数据库引擎。它的特点包括:

  • 零配置:不需要像传统的数据库服务器那样进行复杂的安装和配置过程,它是一个自包含的库。
  • 小巧轻便:数据库以文件形式存在,整个数据库(包括结构、数据和索引)都存储在一个文件中,便于存储和传输。
  • 跨平台支持:可以在多种操作系统上使用,如Windows、Linux、macOS等。

3.2 在QT中的使用

在QT中使用SQLite非常方便。由于QT默认包含了SQLite驱动,只需要按照一般的数据库连接步骤,指定数据库文件名(SQLite数据库以文件形式存储)作为连接参数即可。例如:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my_database.db");
if (db.open()) {
    // 数据库连接成功后的操作
} else {
    // 处理连接失败的情况
}

4. 示例数据库

4.1 创建简单的示例数据库

假设要创建一个简单的学生信息数据库,包含学生的学号、姓名、年龄和专业等信息。使用SQLite和QT,可以按照以下步骤:

  1. 建立连接:如上述代码片段所示,通过QSqlDatabase建立与SQLite数据库的连接。
  2. 创建表:使用QSqlQuery执行SQL的CREATE TABLE语句来创建学生信息表。
QSqlQuery query;
query.exec("CREATE TABLE students (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, major TEXT)");
  1. 插入数据:同样使用QSqlQuery,可以插入一些示例学生数据。
query.exec("INSERT INTO students (name, age, major) VALUES ('Alice', 20, 'Computer Science')");
query.exec("INSERT INTO students (name, age, major) VALUES ('Bob', 21, 'Mathematics')");

5. QSqlTableModel的使用

5.1 基本概念

QSqlTableModel类提供了一种简单的方式来将数据库中的表呈现为一个数据模型。它允许在视图(如QTableView)中直接显示和编辑表数据。
在这里插入图片描述

5.2 使用步骤

  1. 创建模型对象:首先创建一个QSqlTableModel对象,并将其与数据库连接关联。
QSqlTableModel *model = new QSqlTableModel(this, db);
  1. 设置表名:指定要操作的数据库表。
model->setTable("students");
  1. 选择数据:调用select()方法从表中获取数据。
model->select();
  1. 将模型与视图关联:将QSqlTableModel对象与QTableView关联,这样视图就可以显示表中的数据。
QTableView *view = new QTableView;
view->setModel(model);
  1. 编辑数据:通过视图可以直接对数据进行编辑,QSqlTableModel会自动将更改更新到数据库中。

5.3 主要功能

  • 排序:可以通过setSort()方法对表中的数据进行排序。例如,要按照学生年龄升序排序:
model->setSort(2, Qt::Ascending);
model->select();
  • 筛选数据:使用setFilter()方法可以筛选出符合条件的数据。例如,要筛选出计算机科学专业的学生:
model->setFilter("major = 'Computer Science'");
model->select();

6. 主要的类和基本工作原理

6.1 QSqlDatabase

  • 工作原理:它是一个用于管理数据库连接的类。当创建一个QSqlDatabase对象时,可以指定数据库类型(如通过加载不同的驱动来支持SQLite、MySQL等)和连接参数。它维护了数据库连接的状态,包括打开、关闭等操作。在内部,它与数据库驱动进行交互,实现与具体数据库的通信。
  • 重要方法
    • addDatabase():用于添加一个数据库连接,需要指定数据库驱动类型。
    • setDatabaseName()setUserName()setPassword()等:用于设置连接参数。
    • open()close():分别用于打开和关闭数据库连接。

6.2 QSqlQuery

  • 工作原理:用于执行SQL语句。它将SQL语句发送到数据库管理系统,并处理返回的结果(如果有)。可以执行各种类型的SQL语句,并且通过一些方法来遍历查询结果,如next()方法用于移动到下一条记录。
  • 重要方法
    • exec():执行SQL语句。
    • value():用于获取当前记录中指定列的值。
    • first()last()previous()等:用于在查询结果中定位记录。

6.3 QSqlTableModel

  • 工作原理:它作为一个数据模型,将数据库中的表数据抽象为可以被视图(如QTableView)使用的形式。它会自动从数据库中获取表数据,并根据视图的操作(如排序、筛选、编辑)更新数据库。它在内部通过与数据库的交互(通常是通过QSqlQuery)来实现这些功能。
  • 重要方法
    • setTable():指定要操作的数据库表。
    • select():从表中获取数据。
    • setSort()setFilter():用于排序和筛选数据。

6.4 QSqlQueryModel

  • 工作原理:与QSqlTableModel类似,它也是一个数据模型,但它主要用于执行自定义的SQL查询。它将查询结果转换为数据模型,供视图使用。它不像QSqlTableModel那样直接操作一个完整的表,而是可以根据具体的SQL查询(如复杂的多表联合查询)来获取数据。
  • 重要方法
    • setQuery():用于设置要执行的SQL查询语句。

7. 打开数据库

7.1 步骤回顾

  1. 加载驱动:对于大多数常见数据库(如SQLite),QT会自动加载驱动。但对于一些其他数据库,可能需要手动加载驱动,例如在使用某些数据库插件时。
  2. 创建数据库对象:使用QSqlDatabase::addDatabase()方法创建一个数据库连接对象,并指定数据库驱动类型。
  3. 设置连接参数:根据数据库类型,设置数据库名称、用户名、密码等参数。例如,对于SQLite,主要是设置数据库文件名。
  4. 打开连接:调用数据库对象的open()方法来打开数据库连接。

7.2 错误处理

在打开数据库连接过程中,可能会出现各种错误,如驱动加载失败、连接参数错误、数据库文件不存在等。可以通过检查open()方法的返回值来判断连接是否成功。如果连接失败,可以使用lastError()方法获取详细的错误信息,例如:

if (!db.open()) {
    qDebug() << "数据库连接失败: " << db.lastError().text();
}

8. QSqlQueryModel类

8.1 使用

  1. 创建对象并设置查询:创建一个QSqlQueryModel对象,并使用setQuery()方法设置要执行的SQL查询。
QSqlQueryModel *queryModel = new QSqlQueryModel(this);
queryModel->setQuery("SELECT * FROM students");
  1. 与视图关联:将QSqlQueryModel对象与QTableView关联,以便在视图中显示查询结果。
QTableView *view = new QTableView;
view->setModel(queryModel);

8.2 实现细节

  • 数据获取:当调用setQuery()方法时,QSqlQueryModel会内部创建一个QSqlQuery对象,并执行指定的SQL查询。它会从查询结果中提取数据,并将其存储在内部的数据结构中,以便视图可以访问。
  • 更新数据:如果底层数据库中的数据发生变化,QSqlQueryModel本身不会自动更新。但是,可以通过重新执行查询(再次调用setQuery())来更新视图中显示的数据。

9. 数据表之间的关系

9.1 关系型数据库基础

在关系型数据库中,数据表之间可以存在多种关系,如一对一、一对多、多对多关系。

  • 一对一关系:例如,一个用户和其唯一的用户配置文件之间的关系。在数据库中,可以通过在两个表中使用相同的主键来建立这种关系。
  • 一对多关系:如一个班级和多个学生之间的关系。在数据库设计中,通常在“多”的一方(学生表)中设置一个外键,指向“一”的一方(班级表)的主键。
  • 多对多关系:例如,学生和课程之间的关系。因为一个学生可以选修多门课程,一门课程可以有多个学生选修。这种关系通常需要通过一个中间表(选课表)来建立,中间表包含两个外键,分别指向学生表和课程表的主键。

9.2 在QT中的处理

  • 使用SQL查询处理关系:可以通过编写复杂的SQL查询(如JOIN语句)来获取相关联的数据。例如,要获取某个班级的所有学生信息,可以使用SELECT * FROM students JOIN classes ON students.class_id = classes.id WHERE classes.name = 'Class 1'这样的查询。
  • 使用数据模型处理关系(高级):对于一些复杂的关系操作,QT提供了更高级的数据模型,如QSqlRelationalTableModel。它可以帮助处理数据表之间的关系,特别是外键关系,使得在视图中显示和编辑相关数据更加方便。

10. QSqlRelationalTableModel类及使用

10.1 基本概念

QSqlRelationalTableModelQSqlTableModel的扩展,主要用于处理具有外键关系的数据库表。它允许在一个表格视图中显示外键关联的数据,并且可以通过下拉菜单等方式方便地编辑外键值。

10.2 使用步骤

  1. 创建模型对象:与QSqlTableModel类似,创建一个QSqlRelationalTableModel对象,并将其与数据库连接关联。
QSqlRelationalTableModel *relModel = new QSqlRelationalTableModel(this, db);
  1. 设置表名:指定要操作的主表。
relModel->setTable("students");
  1. 设置外键关系:假设学生表中有一个外键class_id指向班级表的id,可以设置这种关系。
relModel->setRelation(3, QSqlRelation("classes", "id", "name"));
  • 这里的3表示学生表中class_id列的索引(从0开始计数)。QSqlRelation构造函数中的参数分别是关联表名(班级表classes)、关联表的主键(id)和要在视图中显示的关联表中的列(name)。
  1. 选择数据:调用select()方法获取数据。
relModel->select();
  1. 与视图关联:将QSqlRelationalTableModel对象与QTableView关联,在视图中可以看到外键列以下拉菜单等更友好的方式显示关联数据。
QTableView *view = new QTableView;
view->setModel(relModel);

在这里插入图片描述


http://www.kler.cn/a/470842.html

相关文章:

  • STM32——系统滴答定时器(SysTick寄存器详解)
  • 部署:上传项目代码 配置数据库
  • C++list
  • 数据库1-4讲
  • 计算机网络 (22)网际协议IP
  • Docker图形化界面工具Portainer最佳实践
  • 自组织映射 (Self-Organizing Map, SOM) 算法详解与PyTorch实现
  • XXL-RPC v1.8.1 | RPC服务框架
  • 去耦电容理解:“耦”了什么?非要“去”了?
  • Bash语言的软件工程
  • 模电面试——设计题及综合分析题0x03(含答案)
  • Android:文件管理:打开文件意图
  • 七次课掌握 Photoshop
  • 【vue指令】
  • Django外键模型未保存引用
  • JAVA上门洗车家政上门服务小程序H5源码上门洗车APP
  • Ubuntu下的小bug
  • 微信小程序获取图片使用session(下篇)
  • leetcode155.最小栈
  • python学opencv|读取图像(二十七)使用time()绘制弹球动画
  • 企业二要素如何用C#实现
  • Scala语言的数据库交互
  • STM32-笔记30-串口间的通信
  • python常见绘图及代码
  • 技术文档撰写之道:构建清晰准确的知识传递桥梁
  • 【Java设计模式-1】单例模式,Java世界的“独苗”