PyQt6/PySide6 的 SQL 数据库操作(QtSql)
一、核心组件架构
1.1 QtSql模块构成
- QSqlDatabase:数据库连接管理(支持连接池)
- QSqlQuery:SQL语句执行与结果遍历
- QSqlTableModel:可编辑的表格数据模型
- QSqlQueryModel:只读查询结果模型
- QSqlRelationalTableModel:支持外键关系模型
1.2 数据库驱动支持
print(QSqlDatabase.drivers()) # 输出可用驱动列表
# 典型输出:['QSQLITE', 'QMYSQL', 'QPSQL', 'QODBC']
二、数据库连接实战
2.1 SQLite连接示例
def create_connection():db = QSqlDatabase.addDatabase('QSQLITE')db.setDatabaseName('contacts.db')if not db.open():QMessageBox.critical(None, "数据库错误",f"连接失败:{db.lastError().text()}")return False# 验证表存在性required_tables = {'contacts'}existing_tables = db.tables(QSql.Tables)if not required_tables.issubset(existing_tables):init_database(db)return Truedef init_database(conn):query = QSqlQuery()query.exec("""CREATE TABLE contacts (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,phone TEXT UNIQUE,email TEXT,created_at DATETIME DEFAULT CURRENT_TIMESTAMP)""")# 创建索引query.exec("CREATE INDEX idx_contacts_name ON contacts(name)")
2.2 MySQL连接配置
db = QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('localhost')
db.setPort(3306)
db.setDatabaseName('mydb')
db.setUserName('root')
db.setPassword('secret')
db.setConnectOptions("MYSQL_OPT_RECONNECT=1;")
三、CRUD操作进阶
3.1 参数化查询(防SQL注入)
# 插入数据
query = QSqlQuery()
query.prepare("""INSERT INTO contacts (name, phone, email)VALUES (?, ?, ?)
""")
query.addBindValue("张三")
query.addBindValue("13800138000")
query.addBindValue("zhangsan@example.com")
query.exec()# 批量插入
names = [("李四", "13912345678"), ("王五", "13687654321")]
query.prepare("INSERT INTO contacts (name, phone) VALUES (?, ?)")
for name, phone in names:query.addBindValue(name)query.addBindValue(phone)query.exec()
3.2 复杂查询与结果处理
query = QSqlQuery()
query.exec("""SELECT id, name, phone, strftime('%Y-%m-%d', created_at) AS create_dateFROM contactsWHERE name LIKE ?ORDER BY created_at DESCLIMIT 10
""")
query.addBindValue("%张%")while query.next():record = query.record()print(f"ID: {query.value(0)}, Name: {query.value('name')}")print(f"Phone: {record.value(2)}, Date: {query.value(3)}")
四、模型-视图编程
4.1 QSqlTableModel实时同步
class ContactManager(QWidget):def __init__(self):self.model = QSqlTableModel()self.model.setTable("contacts")self.model.setEditStrategy(QSqlTableModel.OnFieldChange)self.model.select()self.view = QTableView()self.view.setModel(self.model)self.view.setColumnHidden(0, True) # 隐藏ID列self.view.doubleClicked.connect(self.edit_contact)def add_contact(self):row = self.model.rowCount()self.model.insertRow(row)self.model.setData(self.model.index(row, 1), "新联系人")self.model.submitAll()def delete_contact(self):index = self.view.currentIndex()if index.isValid():self.model.removeRow(index.row())self.model.submitAll()
4.2 自定义查询模型
class FilterProxyModel(QSortFilterProxyModel):def __init__(self, pattern, parent=None):super().__init__(parent)self.pattern = QRegularExpression(pattern, QRegularExpression.CaseInsensitiveOption)def filterAcceptsRow(self, row, parent):model = self.sourceModel()index = model.index(row, 1) # 过滤name列return self.pattern.match(model.data(index)).hasMatch()# 使用示例
custom_model = QSqlQueryModel()
custom_model.setQuery("SELECT * FROM contacts")
proxy = FilterProxyModel("张")
proxy.setSourceModel(custom_model)
view.setModel(proxy)
五、事务与性能优化
5.1 事务处理模板
db = QSqlDatabase.database()
db.transaction()try:# 执行多个操作insert_query.exec()update_query.exec()db.commit()
except:db.rollback()raise
5.2 连接池配置
from PySide6.QtCore import QSettingsdef setup_connection_pool():settings = QSettings("config.ini", QSettings.IniFormat)QSqlDatabase.setConnectOptions(f"QSQLITE_MAX_CONNECTIONS=20;"f"QSQLITE_BUSY_TIMEOUT=5000;")for i in range(5): # 初始化5个连接conn = QSqlDatabase.addDatabase('QSQLITE', f"conn_{i}")conn.setDatabaseName(settings.value("Database/Path"))
六、实战案例:通讯录管理系统
功能清单:
- 联系人增删改查
- 拼音快速检索
- 导出CSV功能
- 数据库备份/恢复
- 批量导入Excel
关键代码实现:
class ContactBook(QMainWindow):def export_csv(self):with open('contacts.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['姓名', '电话', '邮箱'])query = QSqlQuery("SELECT name, phone, email FROM contacts")while query.next():writer.writerow([query.value(0),query.value(1),query.value(2)])
七、常见问题解决方案
7.1 中文乱码处理
# MySQL连接字符串添加charset参数
db.setConnectOptions("MYSQL_OPT_SET_CHARSET_NAME=UTF8MB4;")# SQLite设置编码
query.exec("PRAGMA encoding = 'UTF-8'")
7.2 数据库迁移方案
使用Alembic进行版本控制:
# 版本迁移脚本示例
from alembic import op
import sqlalchemy as sadef upgrade():op.create_table('contacts',sa.Column('id', sa.Integer, primary_key=True),sa.Column('name', sa.String(50), nullable=False))def downgrade():op.drop_table('contacts')
附录:PyQt6与PySide6差异对照表
| 功能点 | PyQt6 | PySide6 |
|---|---|---|
| 模块导入 | from PyQt6 import QtSql | from PySide6 import QtSql |
| 信号语法 | pyqtSignal | Signal |
| 数据库错误处理 | QSqlError | QSqlError (相同实现) |
通过本指南,开发者可以快速掌握PyQt6/PySide6数据库编程的核心要点,并构建出高性能、易维护的数据库应用程序。
相关文章:
PyQt6/PySide6 的 SQL 数据库操作(QtSql)
一、核心组件架构 1.1 QtSql模块构成 QSqlDatabase:数据库连接管理(支持连接池)QSqlQuery:SQL语句执行与结果遍历QSqlTableModel:可编辑的表格数据模型QSqlQueryModel:只读查询结果模型QSqlRelationalTab…...
利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析
文章目录 引言:当.class文件遇到源代码缺失第一章:反编译技术基础认知1.1 Java编译执行原理1.2 反编译的本质1.3 法律与道德边界 第二章:IDEA内置反编译工具详解2.1 环境准备2.2 三步完成基础反编译2.3 高级反编译技巧2.3.1 调试模式反编译2.…...
Kafka偏移量管理全攻略:从基础概念到高级操作实战
#作者:猎人 文章目录 前言:概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…...
【R语言】GitHub Copilot安装-待解决
参考: 文章目录...
软件定义汽车时代的功能安全和信息安全
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
qt的QSizePolicy的使用
使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中,QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为,可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…...
简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
作为国产数据库的领军选手,金仓数据库(KingbaseES)凭借其成熟的技术架构和广泛的市场覆盖,在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业,还是铁路、医疗等关键领域,金仓数据库都以其卓…...
DeepSeek自动化写作软件
DeepSeek写作软件的三大核心功能 对于内容创作者来说,写作不仅是表达思想的过程,更是一项需要投入大量时间和精力的任务。面对日益增长的内容需求,写作效率低下、内容质量不高等问题,常常让创作者感到焦虑。而 DeepSeek 写作软件…...
【kafka系列】Kafka如何实现高吞吐量?
目录 1. 生产者端优化 核心机制: 关键参数: 2. Broker端优化 核心机制: 关键源码逻辑: 3. 消费者端优化 核心机制: 关键参数: 全链路优化流程 吞吐量瓶颈与调优 总结 Kafka的高吞吐能力源于其生…...
learn_pytorch03
第三章 深度学习分为如下几个步骤 1:数据预处理,划分训练集和测试集 2:选择模型,设定损失函数和优化函数 3:用模型取拟合训练数据,并在验证计算模型上表现。 接着学习了一些数据读入 模型构建 损失函数的构…...
机器学习:k近邻
所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…...
redis之lua实现原理
文章目录 创建并修改Lua环境Lua环境协作组件伪客户端lua scripts字典 EVAL命令的实现定义脚本函数执行脚本函数 EVALSHA命令的实现脚本管理命令的实现SCRIPT FLUSHSCRIPTEXISTSSCRIPT LOADSCRIPT KILL 脚本复制复制 EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令* 复制EVALSHA命…...
[Android] 【汽车OBD软件】Torque Pro (OBD 2 Car)
[Android] 【汽车OBD软件】Torque Pro (OBD 2 & Car) 链接:https://pan.xunlei.com/s/VOIyKOKHBR-2XTUy6oy9A91yA1?pwdm5jm# 获取 OBD 故障代码、汽车性能数据等等。Torque 使用连接到您的 OBD2 发动机管理/ECU 的 OBD II 蓝牙适配器。…...
安全问答—安全的基本架构
前言 将一些安全相关的问答进行整理汇总和陈述,形成一些以问答呈现的东西,加入一些自己的理解,欢迎路过的各位大佬进行讨论和论述。很多内容都会从甲方的安全认知去进行阐述。 1.安全存在的目的? 为了支持组织的目标、使命和宗…...
Java 运行时常量池笔记(详细版
📚 Java 运行时常量池笔记(详细版) Java 的运行时常量池(Runtime Constant Pool)是 JVM 方法区的一部分,用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示,具有动态…...
mysql增加字段操作以及关键字报错
修改mysql DDL语言 修改代码中domain 修改mapper中信息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near index, date, scroll_id, shard_ser…...
Wireshark 输出 数据包列表本身的值
在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…...
日常开发中,使用JSON.stringify来实现深拷贝的坑
使用JSON.stringify的方式来实现深拷贝的弊端 弊端一:无法拷贝NaN、Infinity、undefined这类值 无法拷贝成功的原因: 对于JSON来说,它支持的数据类型只有null、string、number、boolean、Object、Array,所以对于它不支持的数据类…...
【探商宝】:大数据与AI赋能,助力中小企业精准拓客引
引言:在数据洪流中,如何精准锁定商机? 在竞争激烈的商业环境中,中小企业如何从海量信息中快速筛选出高价值客户?如何避免无效沟通,精准触达目标企业? 探商宝——一款基于大数据与AI技术的企业信…...
Javascript网页设计案例:通过PDF.js实现一款PDF阅读器,包括预览、页面旋转、页面切换、放大缩小、黑夜模式等功能
前言 目前功能包括: 切换到首页。切换到尾页。上一页。下一页。添加标签。标签管理页面旋转页面随意拖动双击后还原位置 其实按照自己的预期来说,有很多功能还没有开发完,配色也没有全都搞完,先发出来吧,后期有需要…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
