PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

news2024/9/24 3:29:11

使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。

一、QtSql类

QtSql类时的数据库操作接口类,包含如下类:

QSql

QSqlError

QSqlQueryModel

QSqlRelationalTableModel

QSqlDatabase

QSqlField

QSqlRecord

QSqlResult

QSqlDriver

QSqlIndex

QSqlRelation

QSqlTableModel

QSqlDriverCreatorBase

QSqlQuery

QSqlRelationalDelegate

二、数据库操作

2.1 创建数据库

通过QSqlDataBase连接数据,sqlite是文件形式存储到本地,所以设置文件名 进行访问,当数据库不存在时会自动创建数据库。

        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(filePath)

2.2 打开数据库

直接调用open()方法打开数据,返回值是打开成功与否的标志。

        if not self.db.open():
            print("数据库连接失败!")
            return False
        else:
            print("数据库连接成功!")
            return True

2.3 创建表

通过QSqlQuery创建表,数据库打开后直接创建QSqlQuery对象即可,只添加一个数据库时为默认数据库,不需要指定数据库。

        query = QSqlQuery()
        query.exec(
            'create table test(id int primary key unique, name varchar(15), notes varchar(50))')
        self.db.close()

2.4 添加数据

使用sql直接添加数据,需要注意sql语句中,字符类型需要添加双引号“”。

        query.exec(
            f'insert into test values({test.id},"{test.name}","{test.notes}")')
        self.db.close()

2.5 使用model查询

使用QSqlTableModel查询操作数据,直接设置对应的表名,即可快速操作。

        model = QSqlTableModel()
        model.setTable("test")
        model.setEditStrategy(QSqlTableModel.EditStrategy.OnFieldChange)
        model.select()
        model.setHeaderData(0, Qt.Orientation.Horizontal, "ID")
        model.setHeaderData(1, Qt.Orientation.Horizontal, "Name")
        model.setHeaderData(2, Qt.Orientation.Horizontal, "Notes")
        return model

三、界面显示

添加一个简单的界面显示数据和基本操作

3.1 view

from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QTableView
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QGridLayout
from PyQt6.QtWidgets import QVBoxLayout


class MainWindowView(QMainWindow):
    """Main window view"""

    def __init__(self) -> None:

        super().__init__()
        self.init_ui()

    def init_ui(self):
        """Init ui"""

        self.resize(600, 200)
        self.mainwidget = QWidget()
        self.setCentralWidget(self.mainwidget)
        self.mainlayout = QGridLayout()
        self.mainwidget.setLayout(self.mainlayout)

        self.tv_main = QTableView()
        self.mainlayout.addWidget(self.tv_main, 0, 0)

        self.layout_edit = QVBoxLayout()
        self.mainlayout.addLayout(self.layout_edit, 0, 1)

        self.btn_add = QPushButton("Add")
        self.btn_add.setObjectName("btn_add")
        self.layout_edit.addWidget(self.btn_add)

        self.btn_delete = QPushButton("Delete")
        self.layout_edit.addWidget(self.btn_delete)

3.2 controller

# _*_ coding:utf-8 _*_

from PyQt6.QtCore import QObject
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QPushButton
from view.mainview import MainWindowView
from model.sqlitedb import SqliteDB


class MainWindowController(QObject):
    """The controller of main window."""

    def __init__(self) -> None:
        """Init"""

        super().__init__()

        self.mainview = MainWindowView()
        '''主窗体'''
        self.btn_add = self.mainview.findChild(QPushButton, "btn_add", Qt.FindChildOption.FindChildrenRecursively)
        """添加一行按钮"""
        self.btn_add.clicked.connect(self.addrow)
        self.btn_delete = self.mainview.btn_delete
        self.btn_delete.clicked.connect(lambda: self.model_testtable.removeRow(self.tv_main.currentIndex().row()))
        self.tv_main = self.mainview.tv_main
        '''主界面显示TableView'''
        self.tv_main.clicked.connect(self.tableselectedchanged)

        self.init_db()

        self.model_testtable = self.testdb.query_testtable()
        self.tv_main.setModel(self.model_testtable)

        self.mainview.show()

    def init_db(self):
        """Init database"""

        self.testdb = SqliteDB()
        dbpath = r".\zero.sqlite\db\test.db"
        print(dbpath)
        self.testdb.create_db(dbpath)
        self.testdb.create_testtable()

    def addrow(self):
        """添加一行"""

        self.model_testtable.insertRow(self.model_testtable.rowCount())

    def tableselectedchanged(self, item):
        """table selected"""

        self.selecteitem = item
        print("Selected Row:", str(self.selecteitem.row()))

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

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

相关文章

SQL基础入门-条件查询语句

前言 可以关注我的云原生社区:云原生社区 也可以关注我的英语社区:从零开始学英语 一. 创建数据库并写入数据 1.1 创建数据库 MySQL [school]> create database game; Query OK, 1 row affected (0.01 sec)MySQL [school]> use game Database c…

[PyTorch][chapter 40][CIFAR-10 数据集]

前言: CIFAR-10和CIFAR-100是8000万个微小图像数据集的标记子集。它们由Alex Krizhevsky、Vinod Nair和Geoffrey Hinto收集 目录: CIFAR-10数据集简介 在线下载方式 离线下载方式 一 CIFAR-10数据集简介 CIFAR-10数据集由10个类别的60000张32x32…

碳中和城市建筑能源系统(3):负荷篇(龙惟定)2022

碳中和城市建筑能源系统(3):负荷篇 摘要 本文是碳中和城市建筑能源系统系列文章的第三篇。碳中和城市能源系统要实现“两个替代”,即能源生产的可再生能源替代和能源消费的电力替代。因此有2个关键点对负荷分析提出了要求:一是建筑电气化&a…

网络安全运维-数字取证篇

Volatility使用 使用工具:Autopsy、Volatility、Wireshark 这部分可分为数据分析与取证、内存取证两块内容 一、数据分析与取证 1、wirwshark图形化 wireshark基本操作 过滤器使用 ip.src x.x.x.x 选择源ip为x.x.x.x的数据包 tcp.port xx 选择源或目标端口…

WPF开发txt阅读器13:绑定快捷键实现翻页

文章目录 绑定快捷键翻页功能跳转到首尾章节跳转 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录字体控件绑定💎前景/背景颜色书籍管理系统💎用树形图管理书籍语音播放💎播放进度显示💎快进…

python数据可视化玩转Matplotlib直方图、箱型图、密度图、正态分布、偏度和峰度

目录 1. 直方图、箱线图和密度图 1.1 直方图 1.2 箱线图 1.3 密度图 2. 正态分布 3. 偏度和峰度 结论 1. 直方图、箱线图和密度图 直方图、箱线图和密度图是数据分析中十分常用的图形。它们可以帮助我们更好地理解数据的分布情况,从而更好地进行数据分析和处…

M1和M2的剪刀差是什么意思?

Scissors difference between M1 and M2. 在市场上流通的货币的数量,用金融术语来讲叫货币供应量。 因为市场上的货币流动性各不相同,长期存款的流动性不如短期存款的强,短期存款的流动性不如现金的强。 所以在统计货币量的时候,标…

Linux优化命令之free命令

free 这里写目录标题 一、free命令描述:1.free命令的语法:2.free命令的选项:3.free命令的输出格式: 二、压力测试工具stress:1.工具简介:2.参数详解:3.下载压力测试工具: 三、模拟实…

osg环境搭建与使用

目录 环境安装 案例一: 案例二: 案例三: 案例四: 我的vs2022,window11 环境安装 看这个文章即可,博客很详细,按照这个没问题的 (5条消息) 【OSG】OSG环境部署 OSG3.6.5vs2017win10_x64(超详细&…

STM32F407的介绍

文章目录 芯片STM32F407资源F407总线架构STM32F407系统框图STM32F407地址分配 芯片 STM32F407资源 内核 32位 高性能ARM Cortex-M4处理器时钟: 高达168MHz,实际还可以超频一点点 stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一…

使用大白菜PE给苹果电脑安装win7ghost

如何安装大白菜苹果电脑?ghost (苹果电脑能用大白菜安装系统吗) 喜欢用苹果Mac电脑,开始后发现不习惯苹果的操作系统,还是习惯用Windows我们可以给苹果系统Mac电脑上安装Windows系统,享受苹果的外观,操作windows系统…

【Java】Java核心要点总结 66

文章目录 1. 成员变量 和 局部变量 的区别2 . 静态方法 和 实例方法 区别3. 基本数据类型 和 包装类 的区别4. 局部变量一定存储在栈中吗?5. 包装类型的缓存机制 1. 成员变量 和 局部变量 的区别 ● 语法形式 :从语法形式上看,成员变量是属于…

基于opencv与mediapipe的民族舞舞蹈动作识别

需要项目的请关注、私信 基于opencv与mediapipe的民族舞舞蹈动作识别 1、原理介绍1.1 Opencv1.2 Mediapipe 2、实验步骤2.1 导入工具包2.2 中文输入2.4 建立姿态位置信息库2.5 位置信息获取2.6 姿态识别 3 实验结果与评价 1、原理介绍 1.1 Opencv Opencv(Open So…

Android Studio实现知乎日报App

项目目录 一、项目概述二、开发环境三、运行演示 一、项目概述 本系统基于 MVP RxJava Retrofit进行设计和开发,通过 Retrofit 实现了无网缓存,基于 MVP 模式对 Activity 和 Fragment 封装了两个基类,同样适用于非 MVP 的实现。运用 Recyc…

termux中apache+php的安装

如果 ssl.so.3 not found 需要 apk update 更新一下 然后,pkg install php 完成php 8.2安装 使用命令开启 存储 权限 termux-setup-storage apt install phpmyadmin apt install php-apache apache2 配置文件位于 cd $PREFIX/etc/apache2/ cd /data/data/com.te…

【干货】Android系统定制基础篇:第四部分-Android二次构建

背景 有时我们需要使用同一套Android源码编译生成各种差异化产品固件,比如:A产品、B产品、C产品,各产品之间大部分功能是相同的,仅个别功能定义上有差别。 方法一 Android默认的做法是在源码 device 目录下增加A、B、C产品&…

三个领域的微调模型;Meta推出新的生成式AI模型Voicebox

🦉 AI新闻 🚀 Meta推出新的生成式AI模型Voicebox,可执行音频编辑、采样、风格化等语音生成任务 摘要:Meta继推出ImageBind之后,于今天再次推出了全新的生成式AI模型Voicebox。该模型帮助创作者执行音频编辑、采样和风…

2023年6月最新|大屏可视化配置

大屏可视化配置 运行环境:VScode 一、可视化适配 大屏下显示一般都是16:9尺寸 1920*1080 ,做适配也就是在这个比例的基础上进行的 方案一:打开VSCode终端,下载flexible 1、选中要运行的文件,右键–>【在集成终…

使用Apache ShardingSphere简答实现水平分表

1 简介 Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 官方网站 https://shardingsphere.apache.org/document/current/cn/overview/2 创建…

【算法题刷题笔记】华为OD机试 - 农场施肥

样例一: 5 7 5 7 9 15 10>> 9样例二: 3 1 2 3 4>> -1解题思路 题目大概意思: 给你N个数, 还有一个数M, 让你求K, 进行M次减K操作, 令这N个数都小于等于0。 思路: 利用…