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

PyQt学习系列07-数据库操作与ORM集成

PyQt学习系列笔记(Python Qt框架)

第七课:PyQt的数据库操作与ORM集成


一、PyQt数据库操作概述

1.1 为什么需要数据库操作?

在现代桌面应用程序中,数据持久化是核心需求。PyQt通过QtSql模块提供了对多种数据库的完整支持(如SQLite、MySQL、PostgreSQL),并结合ORM框架(如SQLAlchemy、Django ORM)可实现高效的数据管理。

核心目标

  1. 连接数据库(SQLite、MySQL、PostgreSQL等)。
  2. 执行SQL语句(增删改查)。
  3. 使用数据模型类QSqlTableModelQSqlRelationalTableModel)。
  4. 集成ORM框架(SQLAlchemy、Django ORM)。

二、PyQt数据库操作基础

2.1 核心类与模块

PyQt的QtSql模块提供了以下关键类:

类名功能
QSqlDatabase管理数据库连接(添加驱动、打开/关闭连接)。
QSqlQuery执行SQL语句(查询、插入、更新、删除)。
QSqlTableModel将数据库表映射为表格模型,支持增删改查。
QSqlRecord表示数据库中的一行记录。

三、数据库连接

3.1 SQLite数据库连接

SQLite是轻量级嵌入式数据库,适合小型应用。

示例:连接SQLite数据库

from PyQt5.QtSql import QSqlDatabase, QSqlQuerydef connect_sqlite():db = QSqlDatabase.addDatabase("QSQLITE")db.setDatabaseName("example.db")  # 数据库文件名if not db.open():print("无法打开数据库连接")return Falseprint("成功连接到SQLite数据库")return True

3.2 MySQL数据库连接

MySQL适合需要高并发和复杂查询的场景。

示例:连接MySQL数据库

def connect_mysql():db = QSqlDatabase.addDatabase("QMYSQL")db.setHostName("localhost")       # 主机地址db.setDatabaseName("mydatabase")  # 数据库名db.setUserName("username")        # 用户名db.setPassword("password")        # 密码if not db.open():print("无法打开MySQL数据库连接")return Falseprint("成功连接到MySQL数据库")return True

四、基本数据库操作(CRUD)

4.1 创建表

使用QSqlQuery执行SQL语句创建表。

示例:创建用户表

def create_table():query = QSqlQuery()sql = """CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER)"""if not query.exec_(sql):print("创建表失败:", query.lastError().text())else:print("表创建成功")

4.2 插入数据

使用QSqlQuery插入数据。

示例:插入用户数据

def insert_user(name, age):query = QSqlQuery()sql = "INSERT INTO users (name, age) VALUES (?, ?)"query.prepare(sql)query.addBindValue(name)query.addBindValue(age)if query.exec_():print(f"用户 {name} 插入成功")else:print("插入数据失败:", query.lastError().text())

4.3 查询数据

使用QSqlQuery查询数据。

示例:查询所有用户

def select_users():query = QSqlQuery()query.exec_("SELECT * FROM users")while query.next():user_id = query.value(0)name = query.value(1)age = query.value(2)print(f"ID: {user_id}, Name: {name}, Age: {age}")

4.4 更新和删除数据

更新和删除操作通过SQL语句实现。

示例:更新用户年龄

def update_user_age(name, new_age):query = QSqlQuery()sql = "UPDATE users SET age = ? WHERE name = ?"query.prepare(sql)query.addBindValue(new_age)query.addBindValue(name)if query.exec_():print(f"用户 {name} 年龄更新成功")else:print("更新数据失败:", query.lastError().text())

示例:删除用户

def delete_user(name):query = QSqlQuery()sql = "DELETE FROM users WHERE name = ?"query.prepare(sql)query.addBindValue(name)if query.exec_():print(f"用户 {name} 删除成功")else:print("删除数据失败:", query.lastError().text())

五、使用QSqlTableModel操作数据库

5.1 显示数据到表格

QSqlTableModel将数据库表映射为表格模型,适合与QTableView结合使用。

示例:显示用户表

from PyQt5.QtWidgets import QTableView
from PyQt5.QtSql import QSqlTableModeldef show_table():model = QSqlTableModel(db=QSqlDatabase.database())model.setTable("users")model.select()  # 加载数据view = QTableView()view.setModel(model)view.resizeColumnsToContents()view.show()

5.2 编辑数据

通过QSqlTableModel可以直接编辑表格中的数据。

示例:允许用户编辑数据

model.setEditStrategy(QSqlTableModel.OnFieldChange)  # 实时保存更改
view.setModel(model)
view.show()

六、ORM框架集成

6.1 SQLAlchemy集成

SQLAlchemy是Python中流行的ORM框架,支持多种数据库。

示例:使用SQLAlchemy定义模型

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(50))age = Column(Integer)# 创建数据库连接
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

示例:通过ORM操作数据

# 插入数据
new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()# 查询数据
users = session.query(User).all()
for user in users:print(f"ID: {user.id}, Name: {user.name}, Age: {user.age}")

6.2 Django ORM集成

Django ORM通过模型类定义数据结构,并与PyQt结合实现数据展示。

示例:Django模型定义

from django.db import modelsclass User(models.Model):name = models.CharField(max_length=100)gender = models.CharField(max_length=10)remark_mobiles = models.CharField(max_length=20)corp_name = models.CharField(max_length=100)add_time = models.DateTimeField(auto_now_add=True)

示例:在PyQt中加载Django模型数据

# 假设Django模型已初始化
from myapp.models import Userdef load_data_to_table():users = User.objects.all()for user in users:# 将数据填充到QTableWidget中row_position = self.tableWidget.rowCount()self.tableWidget.insertRow(row_position)self.tableWidget.setItem(row_position, 0, QTableWidgetItem(user.name))self.tableWidget.setItem(row_position, 1, QTableWidgetItem(user.gender))

七、高级数据库功能

7.1 分页与搜索

通过QSqlTableModel实现分页和搜索功能。

示例:分页显示数据

model.setFilter("id > 0")  # 设置过滤条件
model.setSort(0, Qt.AscendingOrder)  # 按ID升序排序
model.select()

示例:搜索特定用户

model.setFilter(f"name LIKE '%{search_text}%'")
model.select()

7.2 事务处理

事务确保多个操作的原子性。

示例:使用事务

db.transaction()
try:query.exec_("UPDATE users SET age = 30 WHERE name = 'Alice'")query.exec_("INSERT INTO users (name, age) VALUES ('Bob', 28)")db.commit()
except:db.rollback()print("事务回滚")

八、常见问题与解决方案

8.1 数据库连接失败

原因:数据库文件不存在、驱动不支持、密码错误。
解决方法

  • 检查数据库路径是否正确。
  • 确保安装了对应数据库驱动(如MySQL驱动需安装mysqlclient)。

8.2 SQL语句报错

原因:SQL语法错误或字段名拼写错误。
解决方法

  • 使用query.lastError().text()获取错误信息。
  • 通过打印SQL语句调试(如print(query.lastQuery()))。

8.3 ORM模型映射问题

原因:ORM模型与数据库表结构不一致。
解决方法

  • 确保ORM模型的字段与数据库表匹配。
  • 使用Base.metadata.create_all(engine)自动创建表。

九、总结与下一步

本节课重点讲解了PyQt的数据库操作与ORM集成,包括:

  1. 数据库连接:SQLite、MySQL、PostgreSQL的支持。
  2. 基本CRUD操作:使用QSqlQuery执行SQL语句。
  3. 数据模型类QSqlTableModel实现表格数据绑定。
  4. ORM集成:SQLAlchemy和Django ORM的使用。
  5. 高级功能:分页、搜索、事务处理。

下节课预告
第八课将深入讲解PyQt的多线程与异步编程,包括QThreadQThreadPoolasyncio的集成,以及如何避免UI卡顿。请持续关注后续内容!


参考资料

  1. PyQt官方文档 - Database
  2. CSDN PyQt5数据库操作教程
  3. SQLAlchemy官方文档
http://www.xdnf.cn/news/617635.html

相关文章:

  • JavaMail的使用
  • 重读《人件》Peopleware -(12-1)Ⅱ 办公环境 Ⅴ 大脑时间与身体时间(上)
  • 超简单 FishSpeech 本地部署
  • 【游戏设计】游戏玩法与游戏机制
  • 决策树引导:如何选择最适合你的机器学习算法
  • 文章记单词 | 第110篇(六级)
  • Java 8 Lambda 表达式使用说明与案例
  • 前端测试简介
  • Python排序函数全面指南:从基础到高级
  • 字符编码详解:ASCII、Latin1、Unicode、UTF-8 与 GBK
  • 365打卡第N1周: one-hot编码案例
  • 【数据反哺运营】用Python构建可落地的商品结构分析方法论-某朴超市
  • 【风控】申请评分卡(A卡)模型
  • QString 写时拷贝简介
  • 2025年电工杯B题思路讲解问题一四种算法
  • Java 集合框架核心知识点全解析:从入门到高频面试题(含 JDK 源码剖析)
  • 解决:dpkg: error: dpkg frontend lock is locked by another process
  • Coze工作流-变量聚合模块的应用
  • IEEE 流程
  • OSS对象存储如何避免被攻击恶意刷流量?
  • QT中延时的用法及定时器的用法
  • 异地容灾、热备与冷备:核心概念解析、技术对比及行业解决方案指南
  • 在Android APK中使用WebView加载Vue项目并实现文件导出
  • 电网绝缘子及破损、闪络缺陷YOLO数据集
  • 【工具变量】地级市创新重视程度数据及城市创新重视程度数据(2003-2025年)
  • 旅游信息检索
  • 每日算法-250523
  • 1.2.1+1.2.2计算机硬件的基本组成
  • 通信专业速成solidworks学习记录
  • 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(上)