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

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

        以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, QTableViewdef create_connection():db = QSqlDatabase.addDatabase('QSQLITE')db.setDatabaseName('example.db')if not db.open():print("无法打开数据库")return Falsereturn Truedef 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 Qtclass 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())

相关文章:

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

以SQLite数据库为例&#xff0c;学习数据库的基本操作&#xff0c;使用QSql模块查询、编辑数据并在前端展示。 SQLite数据库的基础知识&#xff1a; https://blog.csdn.net/xulibo5828/category_12785993.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId1278…...

利用 SAM2 模型探测卫星图像中的农田边界

将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 &#x1f31f; 简介 手动绘制田地边界是最耗时的任务之一&#xff0c;其准确性取决于绘制者的表现。然而&#xff0c;精确的边界检测在很多领域都有应用。例如&#xff0c;假设您…...

前端路由的hash模式和history模式

hash 模式和 history 模式是前端路由实现的两种常见方式&#xff0c;分别基于不同的浏览器特性实现。下面从浏览器实现、前端框架实现及相关标准定义三个方面详细解释这两种模式。 1. 浏览器实现 1.1 Hash 模式 • 核心机制&#xff1a; • 基于浏览器的 location.hash 属性…...

日志收集Day005

1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同&#xff0c;filebeat的message无需设置就是顶级字段 1.1简单使用&#xff1a; filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…...

代码随想录 二叉树 test 2

二叉树的非递归遍历 先序 方法一: 先保存根节点&#xff0c;用来之后找到右子树(利用栈来回溯到根&#xff0c;进而找到右子树) class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res; //存遍历序列stack<TreeNode*…...

浏览器默认语言与页面访问统计问题二三则

文章目录 前言网站默认语言问题网站访问统计问题Error: Empty components are self-closingError: A space is required before closing bracket 总结 前言 看标题大概能猜到这是一篇杂合体的总结&#xff0c;是这两天处理网站遇到的小问题&#xff0c;怕过段时间再忘了所以总…...

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…...

虹科分享 | 汽车NVH小课堂之听音辨故障

随着车主开始关注汽车抖动异响问题&#xff0c;如何根据故障现象快速诊断异响来源&#xff0c;成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天&#xff0c;虹科Pico也整理了几个不同类型的异响声音&#xff0c;一起来听听看你能答对几个吧 汽…...

论文速读|SigLIP:Sigmoid Loss for Language Image Pre-Training.ICCV23

论文地址&#xff1a;https://arxiv.org/abs/2303.15343v4 代码地址&#xff1a;https://github.com/google-research/big_vision bib引用&#xff1a; misc{zhai2023sigmoidlosslanguageimage,title{Sigmoid Loss for Language Image Pre-Training}, author{Xiaohua Zhai and…...

深度学习笔记——循环神经网络之LSTM

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络LSTM知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作…...

算法整理:2-opt求解旅行商(Python代码)

文章目录 算法思想算法步骤代码1纯函数代码2纯函数数据可视化 算法思想 通过交换边进行寻优。 算法步骤 把初始解作为当前解 通过交换边生成新解 如果新解优于历史最优解&#xff0c;则更新当前解为新解 重复2&#xff0c;3&#xff0c;直到当前解交换了所有的边均不能改…...

状态模式

在软件开发过程中&#xff0c;我们经常会遇到这样的情况&#xff1a;一个对象的行为会随着其内部状态的改变而发生变化。例如&#xff0c;一个手机在不同状态下&#xff08;开机、关机、静音等&#xff09;对相同的操作&#xff08;如来电&#xff09;会有不同的反应。传统的解…...

RoHS 简介

RoHS&#xff08;Restriction of Hazardous Substances Directive&#xff0c;限制有害物质指令&#xff09;是欧盟制定的一项环保法规&#xff0c;旨在限制电气和电子设备中某些有害物质的使用&#xff0c;以减少这些产品对环境和人体健康的危害。 RoHS限制的有害物质及其限量…...

【Vim Masterclass 笔记26】S11L46:Vim 插件的安装、使用与日常管理

文章目录 Section 11&#xff1a;Vim PluginsS11L46 Managing Vim Plugins1 第三方插件管理工具2 安装插件使用的搜索引擎3 Vim 插件的安装方法4 存放 Vim 插件包的路径格式5 示例一&#xff1a;插件 NERDTree 的安装6 示例二&#xff1a;插件 ctrlp.vim 的安装7 示例三&#x…...

深度学习原理与Pytorch实战

深度学习原理与Pytorch实战 第2版 强化学习人工智能神经网络书籍 python动手学深度学习框架书 TransformerBERT图神经网络&#xff1a; 技术讲解 编辑推荐 1.基于PyTorch新版本&#xff0c;涵盖深度学习基础知识和前沿技术&#xff0c;由浅入深&#xff0c;通俗易懂&#xf…...

ELK环境搭建

文章目录 1.ElasticSearch安装1.安装的版本选择1.SpringBoot版本&#xff1a;2.4.2 找到依赖的spring-data-elasticsearch的版本2.spring-data-elasticsearch版本&#xff1a;4.1.3 找到依赖的elasticsearch版本3.elasticsearch版本&#xff1a;7.9.3 2.安装1.官方文档2.下载压…...

基于Springboot + vue实现的民俗网

“前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能学习网站” &#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜…...

第24篇 基于ARM A9处理器用汇编语言实现中断<六>

Q&#xff1a;怎样设计ARM处理器汇编语言程序使用定时器中断实现实时时钟&#xff1f; A&#xff1a;此前我们曾使用轮询定时器I/O的方式实现实时时钟&#xff0c;而在本实验中将采用定时器中断的方式。新增第三个中断源A9 Private Timer&#xff0c;对该定时器进行配置&#…...

【数据结构】_不带头非循环单向链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表&#xff0c;已介绍顺序表&#xff0c;详见下文&#xff1a; 【数据结构】_顺序表-CSDN博客 本文介绍链表&#xff1b; 基于顺序表…...

golang 使用双向链表作为container/heap的载体

MyHeap&#xff1a;container/heap的数据载体&#xff0c;需要实现以下方法&#xff1a; Len&#xff1a;堆中数据个数 Less&#xff1a;第i个元素 是否必 第j个元素 值小 Swap&#xff1a;交换第i个元素和 第j个元素 Push&#xff1a;向堆中追加元素 Pop&#xff1a;从堆…...

C#集合操作优化:高效实现批量添加与删除

在C#中&#xff0c;对集合进行批量操作&#xff08;如批量添加或删除元素&#xff09;通常涉及使用集合类型提供的方法和特性&#xff0c;以及可能的循环或LINQ查询来高效地处理大量数据。以下是一些常见的方法和技巧&#xff1a; 批量添加元素 使用集合的AddRange方法&#x…...

142.WEB渗透测试-信息收集-小程序、app(13)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;141.WEB渗透测试-信息收集-小程序、app&#xff08;12&#xff09; 软件用法&#xff0c…...

24.日常算法

1. 数组中两元素的最大乘积 题目来源 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释…...

分布式理解

分布式 如何理解分布式 狭义的分布是指&#xff0c;指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统&#xff1a;**多个能独立运行的计算机&#xff08;称为结点&#xff09;组成。各个结点利用计算机网络进行信息传递&#xff0c;从而实现共同的“目标或者任…...

wordpress调用指定ID页面的链接

在WordPress中&#xff0c;如果你想调用一个指定ID的页面链接&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用页面ID 你可以直接使用页面的ID来生成链接。例如&#xff0c;如果你想链接到ID为123的页面&#xff0c;可以使用以下代码&#xff1a; <…...

单值二叉树(C语言详解版)

一、摘要 今天要讲的是leetcode单值二叉树&#xff0c;这里用到的C语言&#xff0c;主要提供的是思路&#xff0c;大家看了我的思路之后可以点击链接自己试一下。 二、题目简介 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单…...

python学opencv|读取图像(四十二)使用cv2.add()函数实现多图像叠加

【1】引言 前序学习过程中&#xff0c;掌握了灰度图像和彩色图像的掩模操作&#xff1a; python学opencv|读取图像&#xff08;九&#xff09;用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客 python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三…...

速通Docker === Docker Compose

目录 Docker Compose 简介 Docker Compose 常用命令 使用 Docker Compose 启动 WordPress 普通启动方式&#xff08;使用 Docker 命令&#xff09; 使用 Docker Compose 启动 Docker Compose 的特性 Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Dock…...

LMI Gocator GO_SDK VS2019引用配置

LMI SDK在VS2019中的引用是真的坑爹,总结一下经验,希望后来的人能少走弯路.大致内容如下: &#xff08;1&#xff09; 环境变量 &#xff08;2&#xff09;C/C 附加包含目录 E:\GWQ\Gocator\GO_SDK\Gocator\GoSdk E:\GWQ\Gocator\GO_SDK\Platform\kApi &#xff08;3&#…...

技术之翼,创作之心

引言&#xff1a;初入编程的迷茫与追求 当我第一次接触到编程时&#xff0c;心中充满了既期待又迷茫的情感。那时&#xff0c;我还是一名刚刚踏入大学的学生&#xff0c;面对一门陌生而复杂的学科——计算机科学&#xff0c;我的内心充满了好奇与困惑。课堂上&#xff0c;老师…...