SqlManger开发文档

发布时间 2023-12-18 15:32:36作者: 张Blog

教程地址PyQt5 教程 (w3schools.cn)

开发记录

创建项目

新建python项目, 环境选择新的venv环境

安装必要依赖

当前依赖为项目新增依赖, 后续可能会随开发进行更新

# 提供了与 Python 3.5 或更高版本兼容的 32 位或 64 位架构的 wheels
pip3 install PyQt5
# 要安装 Qt Designer 等开发工具以支持 PyQt5 wheels
pip3 install pyqt5-tools
# 安装链接mysql所需依赖
pip3 install pymysql
# 链接mysql时所用到的加密方式
pip3 install cryptography
# 美化包依赖, 拉取依赖时, 不能使用豆瓣源, 豆瓣源没有这个依赖
pip3 install qdarkstyle 

如果直接使用官方镜像源出现安装失败的情况, 可以考虑国内的镜像源

# 清华源
pip3 install {package} -i https://pypi.tuna.tsinghua.edu.cn/simple
# 豆瓣源
pip3 install {package} -i https://pypi.douban.com/simple

安装依赖方式参考下图

设计UI

打开设计器路径 {项目路径}\venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

设计以下UI文件
主窗口UI: sqlManger_ui.ui
新增记录模态框UI: addrowdialog_ui.ui


UI文件转成成Python文件

pyuic5 -x sqlManger_ui.ui -o sqlManger_ui.py

pyuic5 -x addrowdialog_ui.ui -o addrowdialog_ui.py


转换完成后会生成以下文件

新增记录时, 不同的表格数据不同, 因此需要动态加载模态框表单项,
技术点: setattrgetattr 方法的使用

setattr(目标对象, 属性名, 属性值)
getattr(目标对象, 属性名, 属性值)

重构 addrowdialog_ui.py 下的 setupUi retranslateUi 方法, 设置表单项时, 设置成由传入参数动态加载, 文件调整如下

各个功能点信号与槽函数建立链接

# 连接按钮  
self.ui.connbut.clicked.connect(self.conn_database)  
# 查询按钮  
self.ui.querybut.clicked.connect(self.execute_query)  
# 回滚按钮  
self.ui.roolbackbut.clicked.connect(self.rollback_database)  
# 提交按钮  
self.ui.commitbut.clicked.connect(self.commit_database)  
# 切换数据库选择  
self.ui.database.currentIndexChanged.connect(self.change_database)  
# 更改主题  
self.ui.themeComboBox.currentIndexChanged.connect(self.change_theme)  
# 右键表格, 展示菜单  
self.ui.tableView.setContextMenuPolicy(Qt.CustomContextMenu)  
self.ui.tableView.customContextMenuRequested.connect(self.display_table_menu)

mysql数据库的使用

下载mysql相关依赖

 pip3 install mysql-connector-python

因为涉及到事务的回滚, 所以当前应用获取的数据库链接为单例, 代码如下

@staticmethod  
def get_connection(self):  
    if Utils.connection is not None:  
        return Utils.connection  
    Utils.connection = pymysql.connect(  
        # 数据库主机名  
        host=self.ui.host.text(),  
        # 数据库端口号,默认为3306  
        port=int(self.ui.port.text()),  
        # 数据库用户名  
        user=self.ui.username.text(),  
        # 数据库密码  
        passwd=self.ui.pwd.text(),  
        # 字符编码  
        charset='utf8'  
    )  
    return Utils.connection

@staticmethod  
def get_cursor():  
    if Utils.cursor is not None:  
        return Utils.cursor  
    else:  
        if Utils.connection is None:  
            Utils.connection = Utils.get_connection()  
            Utils.cursor = Utils.connection.cursor()  
            return Utils.cursor  
        else:  
            Utils.cursor = Utils.connection.cursor()  
            return Utils.cursor

事务的开启
开启时机: 与数据库建立链接之后

# 开启事务  
cursor.execute("BEGIN")

事务的提交
提交时机: 点击提交按钮

Utils.get_connection(self).commit()

事务的回滚
回滚时机

Utils.get_connection(self).rollback()

增加美化包

原本的QT样式不怎么好看, 集成一下美化包

pip3 install qdarkstyle -i https://pypi.tuna.tsinghua.edu.cn/simple

安装插件时, 不能使用豆瓣源, 豆瓣源没有这个依赖

main.py 入口文件给实例设置浅色样式

app.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5', palette=LightPalette()))

切换主题样式的实现

监控下拉框数据改变的信号, 链接对应的槽函数

# 为主题切换的信号和槽函数简历链接
self.ui.themeComboBox.currentIndexChanged.connect(self.change_theme)

切换主题的方法实现, 与启动项目时需要添加一步获取应用实例的操作Utils.get_app_self()

def change_theme(self):  
    if self.ui.themeComboBox.currentText() == "Dark":  
        Utils.get_app_self().setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5', palette=DarkPalette()))  
    else:  
        Utils.get_app_self().setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5', palette=LightPalette()))

qt-material 有更丰富的样式

pip install qt-material

应用样式

# 动态加载qt-material主题  
import site  
# venv/Lib/site-packages/qt_material/themes 读取该路径下的文件名  
site_packages_path = site.getsitepackages()[1]  
  
  
# self.ui.themeComboBox.addItems("")


#  venv/Lib/site-packages/qt_material/themes 读取该路径下的文件名
apply_stylesheet(app, theme='light_blue_500.xml')

新增窗口增加滚动条

参考资料Qt designer + ScrollArea 实现滚动界面_qt designer scrollarea-CSDN博客

虚拟环境venv同步

参考资料: python 项目自动生成环境配置文件requirements.txt_如何生成requirements.txt-CSDN博客

生成requirements.txt文件

 pip freeze > requirements.txt

安装依赖,根据requirements.txt

pip install -r requirements.txt

异常问题记录

QSqlDatabase无法加载MYSQL驱动(未解决)

问题现象

QSqlDatabase 无法链接MYSQL数据库, 提示无法加载驱动问题

参考资料:

PyQt5使用QSqlDatabase类连接Mysql的坑

问题原因:

最新版本的QT缺失MYSQL驱动的相关文件

解决方案

根据以上的参考文章操作后问题也没有解决, 最后该问题选择通过pymysql链接数据库, 获取数据, 使用标准的modle来展示

获取MYSQL数据库链接报加密异常(已解决)

问题现象

链接MYSQL在密码, 端口等信息均正确的情况下, 报如下异常

参考资料

RuntimeError: ‘cryptography‘ package is required for sha256_password or caching_sha2_password auth m-CSDN博客

运行项目

项目基础环境

已安装Python3, 可使用以下版本查看python版本

python -V

已安装MySql8.0及以上版本

mysql --help

拉取项目

首先从GITHUB拉取项目, GIT命令行或者下图方式均可
项目地址: https://github.com/lei-ctyh/sqlManger.git

配置项目解释器

按照自己需求配置项目解释器即可
ctrl + alt + s 进入设置 , 具体操作如下图

安装依赖

安装依赖,根据requirements.txt

pip install -r requirements.txt

启动项目

效果展示