PySide6 数据库操作深度实测:从 SQLite 连接到增删改查避坑指南

PySide6 数据库操作深度实测:从 SQLite 连接到增删改查避坑指南

桌面应用常常需要本地数据存储,SQLite 因其轻量、免配置的特性成为首选。PySide6 的 QtSql 模块为我们提供了非常方便的数据库操作接口,尤其是 QSqlTableModel,可以实现数据与界面控件的"零代码"绑定。

1. 建立数据库连接

在使用任何 SQL 类之前,必须先添加并打开数据库。

python 复制代码
from PySide6.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PySide6.QtWidgets import QMessageBox

def init_db():
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("my_data.db")
    if not db.open():
        QMessageBox.critical(None, "数据库错误", f"无法打开数据库: {db.lastError().text()}")
        return False
    return True
2. 神器 QSqlTableModel:免写 SQL 的增删改查

如果你想把数据库表直接显示在 QTableView 中,并且支持用户直接双击修改,QSqlTableModel 是最佳选择。

python 复制代码
# 初始化模型
self.model = QSqlTableModel()
self.model.setTable("users")  # 绑定数据库中的 users 表
self.model.setEditStrategy(QSqlTableModel.OnFieldChange) # 字段修改后自动同步到数据库
self.model.select() # 必须调用 select 才会加载数据

# 绑定到界面表格
self.tableView.setModel(self.model)

增删改操作实战:

  • 增加一行:
  • 删除选中行:
3. 使用 QSqlQuery 执行原生 SQL

对于复杂的查询(如多表联查、聚合统计),QSqlTableModel 就不够用了,这时需要回归原生的 SQL 语句。

python 复制代码
query = QSqlQuery()
# 插入数据
query.exec("INSERT INTO users (name, age) VALUES ('李四', 25)")
# 查询数据
if query.exec("SELECT * FROM users WHERE age > 20"):
    while query.next():
        name = query.value(1) # 获取第1列的值
        print(f"查询到用户: {name}")
4. 避坑指南
  • 连接名冲突 :addDatabase 默认连接名为 qt_sql_default_connection。如果你在多处调用,会覆盖之前的连接。建议给连接起个唯一的名字,如 addDatabase("QSQLITE", "my_conn_1")。
  • 界面卡顿 :QSqlTableModel 的 select() 操作是同步的。如果表中有几十万条数据,主线程会卡死。对于大数据量,建议配合分页查询,或者在子线程中使用 QSqlQuery 读取数据后通过信号传回主线程。
  • 中文乱码:SQLite 默认使用 UTF-8,确保你的 Python 源码文件和数据库交互时编码一致。

相关推荐
大模型最新论文速读27 分钟前
text-to-sql:从学术玩具到生产落地
数据库·sql
ManageEngineITSM1 小时前
工单分类怎么设计?类别、子类别与自动分派的实用方法
大数据·服务器·数据库·人工智能·分类·数据挖掘
ClouGence1 小时前
MongoDB 双向同步如何防止数据循环?(附实操指南)
数据库·mongodb
TDengine (老段)1 小时前
TDengine IDMP 十大实用功能(7)
数据库·物联网·时序数据库·tdengine·涛思数据·工业数据·idmp
Decay__1 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx23882 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
真上帝的左手2 小时前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
雪芽蓝域zzs2 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
实泽有之,无泽虚之2 小时前
SQL Server数据库备份与还原详解
数据库·sqlserver
DevOpenClub2 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考