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

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, 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.kler.cn/a/517355.html

相关文章:

  • 在 Vue 3 中,怎么管理环境变量
  • CLion开发Qt桌面
  • mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表
  • 【第一天】零基础入门刷题Python-算法篇-数据结构与算法的介绍(持续更新)
  • 利用 SAM2 模型探测卫星图像中的农田边界
  • DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
  • 使用 Git LFS 管理大文件基本简介
  • Java开发的商城系统怎样
  • Consul持久化配置报错1067---consul_start
  • ansible自动化运维实战--fetch、cron和group模块(5)
  • 【Uniapp-Vue3】uni-icons的安装和使用
  • 使用Mermaid和AI画流程图
  • vue2和vue3指令
  • [操作系统] 深入进程地址空间
  • 机器学习数据集来源
  • Sourcetree:一款高效便捷的Git版本控制客户端
  • UI操作总结
  • c++在线音乐播放器项目开发记录(1)
  • 【Windows】Linux 远程连接工具SecureCRT9.1、SecureFX9.1的安装
  • VScode连接远程Linux服务器环境配置
  • postgresql根据主键ID字段分批删除表数据
  • Python自动化运维:一键掌控服务器的高效之道
  • 【QT】-explicit关键字
  • 如何将使用unsloth微调的模型部署到ollama?
  • 通过聚合和分离进行音频深度伪造检测的领域泛化
  • Android Studio:视图绑定的岁月变迁(2/100)