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. 使用数据模型类 (QSqlTableModel、QSqlRelationalTableModel)。
  4. 集成ORM框架(SQLAlchemy、Django ORM)。

二、PyQt数据库操作基础

2.1 核心类与模块

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

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

三、数据库连接

3.1 SQLite数据库连接

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

示例:连接SQLite数据库

python 复制代码
from PyQt5.QtSql import QSqlDatabase, QSqlQuery

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

3.2 MySQL数据库连接

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

示例:连接MySQL数据库

python 复制代码
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 False
    print("成功连接到MySQL数据库")
    return True

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

4.1 创建表

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

示例:创建用户表

python 复制代码
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插入数据。

示例:插入用户数据

python 复制代码
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查询数据。

示例:查询所有用户

python 复制代码
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语句实现。

示例:更新用户年龄

python 复制代码
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())

示例:删除用户

python 复制代码
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结合使用。

示例:显示用户表

python 复制代码
from PyQt5.QtWidgets import QTableView
from PyQt5.QtSql import QSqlTableModel

def show_table():
    model = QSqlTableModel(db=QSqlDatabase.database())
    model.setTable("users")
    model.select()  # 加载数据

    view = QTableView()
    view.setModel(model)
    view.resizeColumnsToContents()
    view.show()

5.2 编辑数据

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

示例:允许用户编辑数据

python 复制代码
model.setEditStrategy(QSqlTableModel.OnFieldChange)  # 实时保存更改
view.setModel(model)
view.show()

六、ORM框架集成

6.1 SQLAlchemy集成

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

示例:使用SQLAlchemy定义模型

python 复制代码
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = 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操作数据

python 复制代码
# 插入数据
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模型定义

python 复制代码
from django.db import models

class 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模型数据

python 复制代码
# 假设Django模型已初始化
from myapp.models import User

def 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实现分页和搜索功能。

示例:分页显示数据

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

示例:搜索特定用户

python 复制代码
model.setFilter(f"name LIKE '%{search_text}%'")
model.select()

7.2 事务处理

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

示例:使用事务

python 复制代码
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的多线程与异步编程 ,包括QThread、QThreadPool、asyncio的集成,以及如何避免UI卡顿。请持续关注后续内容!


参考资料:

  1. PyQt官方文档 - Database
  2. CSDN PyQt5数据库操作教程
  3. SQLAlchemy官方文档
相关推荐
captain3761 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
在所不辞兄1 小时前
【零基础学智能仿真-67】力学知识库与检索增强
人工智能·深度学习·神经网络·机器学习·智能仿真
2601_970703831 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02141 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
楚山之石1 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
龙亘川2 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组2 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制
海宇大数据2 小时前
零信任架构实战:基于海宇全能小微企业报告构建自动化持牌网络小贷小微商户极速助业贷秒级全维风险决策网关
网络·人工智能·架构·自动化
zhangjw342 小时前
1-5 PostgreSQL 数据类型全集:基础类型、字符串、数值、时间类型
数据库·postgresql
ZhengEnCi2 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm