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())
相关推荐
weixin_3077791318 分钟前
C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库
数据库·c++·数据仓库·python·sqlserver
kcarly25 分钟前
数据库、数据仓库、数据湖有什么不同
数据库·数据仓库
北顾南栀倾寒32 分钟前
[MySQL]MySQL数据库的介绍和库相关操作
数据库·mysql
island13142 小时前
【QT】 控件 -- 显示类
开发语言·数据库·qt
Andya_net3 小时前
网络安全 | F5-Attack Signatures-Set详解
网络·数据库·web安全
码农幻想梦4 小时前
实验二 数据库的附加/分离、导入/导出与备份/还原
数据库·oracle
hillstream34 小时前
Synology 群辉NAS安装(6)安装mssql
数据库·sqlserver
行十万里人生5 小时前
Qt 控件与布局管理
数据库·qt·microsoft·华为od·华为·华为云·harmonyos
betazhou5 小时前
sysbench压力测试工具mysql以及postgresql
数据库·mysql·postgresql
莳花微语5 小时前
OGG 19C 集成模式启用DDL复制
数据库·oracle