C/C++ Qt 数据库SqlRelationalTable关联表
2023-02-18 16:46:16 时间
在上一篇博文中详细介绍了SqlTableModle
组件是如何使用的,本篇博文将介绍SqlRelationalTable
关联表组件,该组件其实是SqlTableModle
组件的扩展类,SqlRelationalTable
组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,名称)
就是用来实现多表之间快速关联的。
首先我们创建两张表,一张Student
表存储学生名字以及学生课程号,另一张Departments
存储每个编号所对应的系所名称,运行代码完成创建。
void MainWindow::InitSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
return;
// 执行SQL创建表
db.exec("DROP TABLE Student");
db.exec("CREATE TABLE Student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
"departID INTEGER NOT NULL)"
);
// 逐条插入数据
db.exec("INSERT INTO Student(name,departID) VALUES('zhangsan',10)");
db.exec("INSERT INTO Student(name,departID) VALUES('lisi',20)");
db.exec("INSERT INTO Student(name,departID) VALUES('wangwu',30)");
db.exec("INSERT INTO Student(name,departID) VALUES('wangmazi',40)");
db.exec("DROP TABLE Departments");
db.exec("CREATE TABLE Departments("
"departID INTEGER NOT NULL,"
"department VARCHAR(40) NOT NULL)"
);
db.exec("INSERT INTO Departments(departID,department) VALUES (10,'数学学院')");
db.exec("INSERT INTO Departments(departID,department) VALUES (20,'物理学院')");
db.exec("INSERT INTO Departments(departID,department) VALUES (30,'计算机学院')");
db.commit();
db.close();
}
初始化后将得到两张数据表,这两张表通过departID
相关联,如下:
创建完成后,我们在程序的构造函数直接实现绑定即可,这段代码很简单如下:
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitSQL();
// 打开数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
return;
this->setCentralWidget(ui->tableView);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true);
// 打开数据表
tabModel=new QSqlRelationalTableModel(this,DB);
tabModel->setTable("Student"); // 设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); // OnManualSubmit
tabModel->setSort(0,Qt::AscendingOrder);
tabModel->setHeaderData(0,Qt::Horizontal,"学号");
tabModel->setHeaderData(1,Qt::Horizontal,"姓名");
tabModel->setHeaderData(2,Qt::Horizontal,"学院");
// 设置代码字段的查询关系数据表
// 打开Departments表,关联ID和department
tabModel->setRelation(2,QSqlRelation("Departments","departID","department"));
theSelection=new QItemSelectionModel(tabModel);
ui->tableView->setModel(tabModel);
ui->tableView->setSelectionModel(theSelection);
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView)); // 为关系型字段设置缺省代理组件
tabModel->select(); // 打开数据表
}
MainWindow::~MainWindow()
{
delete ui;
}
最终绑定效果如下图:
相关文章
- Docker部署mysql并提供客户端访问
- 哪些因素会导致 MySQL 慢查询
- 如何正确理解 RT 并监控 MySQL 的响应时间
- SQL语句练习04
- docker高级篇1-dockeran安装mysql主从复制
- 3种方法为你的稀有物种建立生物学知识数据库
- 把MsigDB数据库的全部通路转为gsva分析要求的输入格式
- 【mysql】Could not create connection to database server. Attempted reconnect 3 times. Giving up.
- Archery – SQL审核查询平台
- chatGPT实战之「基于你的数据库,为你智能生成SQL」
- 【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)
- 小技巧 EntityFrameworkCore 实现 CodeFirst 通过模型生成数据库表时自动携带模型及字段注释信息
- Flink SQL 知其所以然(二十八):Window TopN 操作
- Flink SQL 知其所以然(二十九):Deduplication去重 & 获取最新状态操作
- Flink SQL 知其所以然(三十):Explain、Show、Load、Set 子句
- 【愚公系列】2022年12月 Elasticsearch数据库-ELK添加中文分词器插件(三)
- MySQL 中基于 XA 实现的分布式事务
- Mysql的MVCC
- mysql默认的隔离级别
- 【mysql】 closing inbound before receiving peer's close_notify问题解决