PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作

news2025/2/1 2:48:25

        以SQLite数据库为例,学习数据库的基本操作,使用QSql模块查询、编辑数据并在前端展示。


SQLite数据库的基础知识:

https://blog.csdn.net/xulibo5828/category_12785993.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12785993&sharerefer=PC&sharesource=xulibo5828&sharefrom=from_link


QSql模块的基本操作:

        QT的QSql 模块提供了对各种数据库的访问和操作功能,使得在 PySide 应用程序中与数据库进行交互变得相对简单。

基本概念

数据库连接(QSqlDatabase):

        QSqlDatabase 类表示与数据库的连接。可以创建多个数据库连接,每个连接可以有不同的配置。

事务(Transactions):

        QSqlDatabase 支持数据库事务,数据库事务将多个数据库操作组合在一起,比如对数据库进行插入、更新、删除等操作。如果这些操作全部成功,就可以提交,让这些操作永久生效;如果其中有任何一个操作失败,那么就全部回滚,即撤销所有已经执行的操作,让数据库恢复到事务开始之前的状态。这样可以保证数据库的一致性和完整性。

查询(QSqlQuery):

        QSqlQuery 类用于执行 SQL 语句和查询数据。通过数据库连接创建 QSqlQuery 对象,并执行 SELECT、INSERT、UPDATE、DELETE 等 SQL 操作。


基本使用方法

  • 导入模块
from PySide6.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel, QSqlQueryModel
from PySide6.QtWidgets import QApplication, QTableView
  • 创建数据库连接、注册数据库驱动
db = QSqlDatabase.addDatabase('QSQLITE')  # 使用 SQLite 数据库
db.setDatabaseName('example.db')
if not db.open():
    print("无法打开数据库")
    exit(1)
  • 执行 SQL 查询

        不使用数据模型,创建 QSqlQuery 对象并执行 SQL 语句:

query = QSqlQuery()
query.exec_("CREATE TABLE IF NOT EXISTS persons (id INTEGER PRIMARY KEY, name VARCHAR(100), age INTEGER)")
query.exec_("INSERT INTO persons (name, age) VALUES ('张三', 30)")
query.exec_("INSERT INTO persons (name, age) VALUES ('李四', 25)")
  • 使用数据模型

        创建 QSqlTableModel 并设置表:

model = QSqlTableModel()
model.setTable('persons')
model.select()
  • 绑定到视图

        创建 QTableView 并设置模型:

app = QApplication([])
view = QTableView()
view.setModel(model)
view.show()
app.exec_()

事务处理

  • 开始事务:

    db.transaction()
    
  • 提交事务:

    db.commit()
    
  • 回滚事务:

    db.rollback()
    

示例代码

        以下是一个完整的示例,展示了如何使用 PySide 的 QSql 模块创建数据库、插入数据,并将数据展示在 QTableView 中:

import sys
from PySide6.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PySide6.QtWidgets import QApplication, QTableView

def create_connection():
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('example.db')
    if not db.open():
        print("无法打开数据库")
        return False
    return True

def create_table():
    query = QSqlQuery()
    query.exec_("CREATE TABLE IF NOT EXISTS persons (id INTEGER PRIMARY KEY, name VARCHAR(100), age INTEGER)")

def insert_data():
    query = QSqlQuery()
    query.exec_("INSERT INTO persons (name, age) VALUES ('张三', 30)")
    query.exec_("INSERT INTO persons (name, age) VALUES ('李四', 25)")

def main():
    if not create_connection():
        sys.exit(1)

    create_table()
    insert_data()

    app = QApplication(sys.argv)

    model = QSqlTableModel()
    model.setTable('persons')
    model.select()

    view = QTableView()
    view.setModel(model)
    view.show()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

一些容易混淆的概念:

前端显示的QTableView 和 QTableWidget :

QTableView和QTableWidget的关系与区别-CSDN博客

         QTableView:适用于需要高度灵活性、复杂数据管理或处理大数据集的场景。它要求开发者管理模型和视图的分离。

        QTableWidget:适用于简单的表格需求,提供便捷的方法来操作表格数据,但灵活性和性能可能受限。

        在实际的使用中,结合QSqlTableModel 和 QSqlQueryModel的话,QTableView的语句要更简洁一些。

数据模型的QSqlTableModel 和 QSqlQueryModel:

Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用-CSDN博客
        QSqlTableModel 和 QSqlQueryModel 是用于将数据库数据绑定到视图(如 QTableView)的模型类。QSqlTableModel 提供了编辑功能,而 QSqlQueryModel 通常用于只读数据展示。

查询类QSqlQuery和QSqlQueryModel的关系

  QSqlQuery 是一个用于执行 SQL 语句,实现各种 SQL 操作的类。QSqlQueryModel是一个数据模型类。QSqlQueryModel内部使用 QSqlQuery 来执行 SQL 查询并获取数据。当为QSqlQueryModel设置一个查询时,它会使用 QSqlQuery 来执行该查询,并将结果存储在模型中,以便视图可以显示这些数据。

PySide6(PyQT),QSqlQueryModel与QSqlQuery的关系-CSDN博客


使用QDataWidgetMapper的简单范例

        QDataWidgetMapper是 Qt 框架中的一个类。它通常用于将数据模型中的数据映射到用户界面上的小部件(widgets)。例如,可以将数据库中的一条记录映射到一组输入框、下拉列表等界面元素上,方便用户查看和编辑数据。它提供了一种方便的方式来管理数据和界面之间的交互。

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLineEdit, QPushButton, QDataWidgetMapper
from PySide6.QtSql import QSqlDatabase, QSqlTableModel
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 设置数据库
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("users.db")
        if not db.open():
            print("无法打开数据库")
            return

        # 创建模型
        self.model = QSqlTableModel()
        self.model.setTable("users")
        self.model.select()

        # 创建映射器
        self.mapper = QDataWidgetMapper()
        self.mapper.setModel(self.model)

        # 创建控件
        self.nameEdit = QLineEdit()
        self.emailEdit = QLineEdit()

        # 设置映射
        self.mapper.addMapping(self.nameEdit, 1)  # 假设姓名在第1列
        self.mapper.addMapping(self.emailEdit, 2)  # 假设邮箱在第2列

        # 创建布局
        layout = QVBoxLayout()
        layout.addWidget(self.nameEdit)
        layout.addWidget(self.emailEdit)
        layout.addWidget(QPushButton("Next", clicked=self.onNext))
        layout.addWidget(QPushButton("Previous", clicked=self.onPrevious))

        # 创建中央部件
        centralWidget = QWidget()
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)

        # 初始化映射器
        self.mapper.toFirst()

    def onNext(self):
        if self.mapper.currentIndex() < self.model.rowCount() - 1:
            self.mapper.toNext()

    def onPrevious(self):
        if self.mapper.currentIndex() > 0:
            self.mapper.toPrevious()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2289130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国&#xff1a;矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…

初二回娘家

昨天下午在相亲相爱一家人群里聊天&#xff0c;今天来娘家拜年。 聊天结束后&#xff0c;开始准备今天的菜肴&#xff0c;梳理了一下&#xff0c;凉菜&#xff0c;热菜&#xff0c;碗菜。 上次做菜&#xff0c;粉丝感觉泡的不透&#xff0c;有的硬&#xff0c;这次使用开水浸泡…

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用

论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接&#xff1a;https://arxiv.org/pdf/2403.06258 代码链接&#xff1a;https://github.com/NUST-Mac…

Blazor-@bind

数据绑定 带有 value属性的标记都可以使用bind 绑定&#xff0c;<div>、<span>等非输入标记&#xff0c;无法使用bind 指令的&#xff0c;默认绑定了 onchange 事件&#xff0c;onchange 事件是指在输入框中输入内容之后&#xff0c;当失去焦点时执行。 page &qu…

架构技能(六):软件设计(下)

我们知道&#xff0c;软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章&#xff08;见 《架构技能&#xff08;五&#xff09;&#xff1a;软件设计&#xff08;上&#xff09;》&#xff09;谈了软件的整体架构设计&#xff0c;今天聊一下模块的详细设计。 模…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

MySQL 容器已经停止(但仍然存在),但希望重新启动它,并使它的 3306 端口映射到宿主机的 3306 端口是不可行的

重新启动容器并映射端口是不行的 由于你已经有一个名为 mysql-container 的 MySQL 容器&#xff0c;你可以使用 docker start 启动它。想要让3306 端口映射到宿主机是不行的&#xff0c;实际上&#xff0c;端口映射是在容器启动时指定的。你无法在容器已经创建的情况下直接修改…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…

将pandas.core.series.Series类型的小数转化成百分数

大年初二&#xff0c;大家过年好&#xff0c;蛇年行大运&#xff01; 今天在编写一个代码的时候&#xff0c;使用 import pandas as pd产生了pandas.core.series.Series类型的数据&#xff0c;里面有小数&#xff0c;样式如下&#xff1a; 目的&#xff1a;将这些小数转化为百…

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享&#xff0c;这是其中的第一部分&#xff0c;用红色字体标注出重点&#xff0c;以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…

代码随想录_栈与队列

栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…

【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅

1.论文链接&#xff1a;Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要&#xff1a; 本章对概率图模型&#xff08;PGMs&#xff09;的最新进展进行了深入的回顾&…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址&#xff0c;在IDEA中查找 这里是getInfo函数的声明&#xff0c;我们要找到这个函数的使用&#xff0c;所以点getInfo() Override public JSONObject getInfo() {JSO…

Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

C语言自定义数据类型详解(二)——结构体类型(下)

书接上回&#xff0c;前面我们已经给大家介绍了如何去声明和创建一个结构体&#xff0c;如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识&#xff1a; 今天的主题是&#xff1a;结构体大小的计算并简单了解一下位段的相关知识。…

Maven的单元测试

1. 单元测试的基本概念 单元测试&#xff08;Unit Testing&#xff09; 是一种软件测试方法&#xff0c;专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试&#xff0c;可以确保每个模块按预期工作&#xff0c;从而提高代码的质量和可靠性。 2.安装和配…