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())

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

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

相关文章

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了&#xff0c;还不了解的uu&#xff0c; 可以移步去看这篇博客哟&#xff1a; 数据结构-栈数据结构-队列 简单回顾一下&#xff0c;重要的概念其实就是后进先出&#xff0c;栈在…

JUC--ConcurrentHashMap底层原理

ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同&#xff1f;ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 1. 双向语言模型&#xff08;BiLM&#xff09; 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的突破与局限性 1. 技术突破 2. …

在做题中学习(82):最小覆盖子串

解法&#xff1a;同向双指针——>滑动窗口 思路&#xff1a;题目要求找到s里包含t所有字符的最小子串&#xff0c;这就需要记录在s中每次查找并扩大范围时所包含进去的字符种类是否和t的相同&#xff0c;并且&#xff1a;题目提示t中会有重复字符&#xff0c;因此不能简单认…

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…

DeepSeek:突破传统的AI算法与下载排行分析

DeepSeek的AI算法突破DeepSeek相较于OpenAI以及其它平台的性能对比DeepSeek的下载排行分析&#xff08;截止2025/1/28 AI人工智能相关DeepSeek甚至一度被推上了搜索&#xff09;未来发展趋势总结 在人工智能技术飞速发展的当下&#xff0c;搜索引擎市场也迎来了新的变革。DeepS…

java 判断Date是上午还是下午

我要用Java生成表格统计信息&#xff0c;如下图所示&#xff1a; 所以就诞生了本文的内容。 在 Java 里&#xff0c;判断 Date 对象代表的时间是上午还是下午有多种方式&#xff0c;下面为你详细介绍不同的实现方法。 方式一&#xff1a;使用 java.util.Calendar Calendar 类…

【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图

1.折线图简介 折线图是一个由点和线组成的统计图表&#xff0c;常用来表示数值随连续时间间隔或有序类别的变化。在折线图中&#xff0c;x 轴通常用作连续时间间隔或有序类别&#xff08;比如阶段1&#xff0c;阶段2&#xff0c;阶段3&#xff09;。y 轴用于量化的数据&#x…

【Java数据结构】了解排序相关算法

基数排序 基数排序是桶排序的扩展&#xff0c;本质是将整数按位切割成不同的数字&#xff0c;然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令&#xff1a; 文件&#xff1a; touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向&#xff08;Redirection&#xff09; 2. 管道&#xff08;Pipes&a…

Ubuntu20.04 磁盘空间扩展教程

Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次&#xff0c;点赞38次&#xff0c;收藏119次。执行命令查看系统容量相关的数据&#xff1a;df -h当前容量为20G&#xff0c;已用18G&#xff08;96%&#xff09;&#xff0c;可用844M&#xff0c;可用…

使用Maxscript定义纹理贴图的方法

在3ds Max中,MaxScript 是一种用于插件编写和自动化任务的强大工具。通过MaxScript,你可以创建和操作对象、材质、灯光等等。要为材质分配纹理贴图,你可以按照以下方法来编写脚本。直接代码: myBmp = bitmaptexture filename:"D:\map001.tga" meditmaterials[1]…

每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树 题目描述数据范围题解解题思路递归算法代码实现代码解析时间和空间复杂度分析示例示例 1示例 2 总结 ) 题目描述 输入一棵节点数为 n 的二叉树&#xff0c;判断该二叉树是否是平衡二叉树。平衡二叉树定义为&#xff1a; 它是一棵空树。或者它的左右子树…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…

day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧

逛自己手机的社区&#xff1a;即&#xff08;手机牌子&#xff09;摄影社区 拍照时防止抖动可以控制自己的呼吸&#xff0c;不要大喘气 拍一张照片后&#xff0c;如何简单的用手机修图&#xff1f; HDR模式就是让高光部分和阴影部分更协调&#xff08;拍风紧时可以打开&…

【翻转硬币——莫比乌斯函数、分块、卷积、埃氏筛】

题目 暴力代码&#xff0c;官网过55% #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<bool> a(n 1);a[1] 1;int res 1;for (int i 2; i < n; i){if (a[i] 0){for (int j i; j < n; j i)a[j] a[j] ^ 1;res;}…

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…

VMware 中Ubuntu无网络连接/无网络标识解决方法【已解决】

参考文档 Ubuntu无网络连接/无网络标识解决方法_ubuntu没网-CSDN博客 再我们正常使用VMware时&#xff0c;就以Ubuntu举例可能有时候出现无网络连接&#xff0c;甚至出现无网络标识的情况&#xff0c;那么废话不多说直接上教程 环境&#xff1a;无网络 解决方案&#…