使用PyQt5开发MSSQL数据库应用
1. 前言
PyQt是Python的一种GUI编程工具包,它包含了一系列的Python模块和工具类,可以用于开发跨平台的桌面应用程序,如操作系统的控制面板、文件管理器等。MSSQL是Microsoft SQL Server数据库的缩写,是Windows平台上广泛使用的关系型数据库管理系统。PyQt5与MSSQL相结合,可以实现一个高效且用户友好的数据库应用程序。本文将主要讲解如何使用PyQt5来开发MSSQL数据库应用。
2. 环境配置
在开始开发之前,需要先配置好开发环境。首先需要下载并安装以下软件:
Python 3.x
PyQt5
pymssql
Microsoft SQL Server Native Client
在安装完这些软件后,需要在PyQt5中加载MSSQL的驱动模块,代码如下:
import pymssql
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
def createConnection():
db = QSqlDatabase.addDatabase('QODBC')
db.setDatabaseName('DRIVER={SQL Server Native Client 11.0};'
'SERVER=your_server_name;'
'DATABASE=your_database_name;'
'UID=your_user_name;'
'PWD=your_password')
if not db.open():
print(db.lastError().text())
return False
return True
其中`your_server_name`、`your_database_name`、`your_user_name`和`your_password`需要替换成你的数据库连接信息。
3. 实现功能
在环境配置完成后,就可以开始设计数据库应用的功能了。本文将以一个简单的学生管理系统为例进行说明。
3.1 数据库设计
学生管理系统需要用到以下两个表:
学生表:包含学生的基本信息,如学生编号、姓名、性别、生日、班级等;
成绩表:包含学生的成绩信息,如学生编号、科目名称、成绩等。
学生表的结构如下:
字段名 | 数据类型 | 说明 |
---|---|---|
student_id | int | 学生编号 |
name | varchar(50) | 学生姓名 |
gender | char(1) | 学生性别 |
birthday | datetime | 学生生日 |
class | varchar(50) | 学生班级 |
成绩表的结构如下:
字段名 | 数据类型 | 说明 |
---|---|---|
id | int | 自增主键 |
student_id | int | 学生编号 |
subject | varchar(50) | 科目名称 |
score | int | 科目成绩 |
3.2 创建界面
使用PyQt5创建学生管理系统的界面,可以使用Qt Designer来完成。首先创建主窗口的UI文件,命名为mainwindow.ui,并将以下控件拖入窗口:
系统标题,使用QLabel控件;
学生信息管理与成绩信息管理的按钮,使用QPushButton控件;
显示学生与成绩信息的表格,使用QTableView控件;
学生信息和成绩信息的编辑窗口,使用QDialog控件。
接着创建学生信息编辑窗口的UI文件,命名为studentdialog.ui,并将以下控件拖入窗口:
学生编号、姓名、性别、生日和班级的标签和文本框,使用QLabel和QLineEdit控件;
确定和取消的按钮,使用QPushButton控件。
同样地,创建成绩信息编辑窗口的UI文件,命名为scoredialog.ui,并将以下控件拖入窗口:
学生编号、科目名称和成绩的标签和文本框,使用QLabel和QLineEdit控件;
确定和取消的按钮,使用QPushButton控件。
完成UI设计后,需要将UI文件转换为Python代码,代码如下:
from PyQt5 import uic
Ui_MainWindow, _ = uic.loadUiType('mainwindow.ui')
Ui_StudentDialog, _ = uic.loadUiType('studentdialog.ui')
Ui_ScoreDialog, _ = uic.loadUiType('scoredialog.ui')
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
class StudentDialog(QtWidgets.QDialog, Ui_StudentDialog):
def __init__(self):
super().__init__()
self.setupUi(self)
class ScoreDialog(QtWidgets.QDialog, Ui_ScoreDialog):
def __init__(self):
super().__init__()
self.setupUi(self)
3.3 实现数据库操作
在学生信息管理和成绩信息管理的界面中,可以使用以下代码使用SQL语句来实现数据库的增删改查操作:
def insert_student(self):
dialog = StudentDialog()
if dialog.exec() == QtWidgets.QDialog.Accepted:
student_id = dialog.student_id.text()
name = dialog.name.text()
gender = dialog.gender.text()
birthday = dialog.birthday.text()
class_name = dialog.class_name.text()
query = QSqlQuery()
sql = "INSERT INTO student ([student_id], [name], [gender], [birthday], [class]) " \
"VALUES ('{0}', '{1}', '{2}', '{3}', '{4}');".format(student_id, name, gender, birthday, class_name)
query.exec_(sql)
self.select_student()
def update_student(self):
indexes = self.student_table_view.selectionModel().selectedRows()
for index in sorted(indexes):
student_id = self.student_table_view.model().index(index.row(), 0).data()
name = self.student_table_view.model().index(index.row(), 1).data()
gender = self.student_table_view.model().index(index.row(), 2).data()
birthday = self.student_table_view.model().index(index.row(), 3).data()
class_name = self.student_table_view.model().index(index.row(), 4).data()
dialog = StudentDialog()
dialog.student_id.setText(str(student_id))
dialog.name.setText(name)
dialog.gender.setText(gender)
dialog.birthday.setText(birthday)
dialog.class_name.setText(class_name)
if dialog.exec() == QtWidgets.QDialog.Accepted:
student_id = dialog.student_id.text()
name = dialog.name.text()
gender = dialog.gender.text()
birthday = dialog.birthday.text()
class_name = dialog.class_name.text()
query = QSqlQuery()
sql = "UPDATE student SET [student_id] = '{0}', [name] = '{1}', [gender] = '{2}', [birthday] = '{3}', " \
"[class] = '{4}' WHERE [student_id] = '{5}'".format(student_id, name, gender, birthday, class_name, student_id)
query.exec_(sql)
self.select_student()
def delete_student(self):
indexes = self.student_table_view.selectionModel().selectedRows()
for index in sorted(indexes):
student_id = self.student_table_view.model().index(index.row(), 0).data()
query = QSqlQuery()
sql = "DELETE FROM student WHERE [student_id] = '{0}'".format(student_id)
query.exec_(sql)
self.select_student()
def select_student(self):
model = QSqlQueryModel()
model.setQuery("SELECT * FROM student")
self.student_table_view.setModel(model)
def insert_score(self):
dialog = ScoreDialog()
if dialog.exec() == QtWidgets.QDialog.Accepted:
student_id = dialog.student_id.text()
subject = dialog.subject.text()
score = dialog.score.text()
query = QSqlQuery()
sql = "INSERT INTO score ([student_id], [subject], [score]) " \
"VALUES ('{0}', '{1}', '{2}');".format(student_id, subject, score)
query.exec_(sql)
self.select_score()
def update_score(self):
indexes = self.score_table_view.selectionModel().selectedRows()
for index in sorted(indexes):
id = self.score_table_view.model().index(index.row(), 0).data()
student_id = self.score_table_view.model().index(index.row(), 1).data()
subject = self.score_table_view.model().index(index.row(), 2).data()
score = self.score_table_view.model().index(index.row(), 3).data()
dialog = ScoreDialog()
dialog.student_id.setText(str(student_id))
dialog.subject.setText(subject)
dialog.score.setText(score)
if dialog.exec() == QtWidgets.QDialog.Accepted:
student_id = dialog.student_id.text()
subject = dialog.subject.text()
score = dialog.score.text()
query = QSqlQuery()
sql = "UPDATE score SET [student_id] = '{0}', [subject] = '{1}', [score] = '{2}' " \
"WHERE [id] = '{3}'".format(student_id, subject, score, id)
query.exec_(sql)
self.select_score()
def delete_score(self):
indexes = self.score_table_view.selectionModel().selectedRows()
for index in sorted(indexes):
id = self.score_table_view.model().index(index.row(), 0).data()
query = QSqlQuery()
sql = "DELETE FROM score WHERE [id] = '{0}'".format(id)
query.exec_(sql)
self.select_score()
def select_score(self):
sql = '''
SELECT score.id, student.[name], score.subject, score.score
FROM score
LEFT JOIN student ON score.student_id = student.student_id
ORDER BY score.id ASC
'''
model = QSqlQueryModel()
model.setQuery(sql)
self.score_table_view.setModel(model)
4. 结语
通过使用PyQt5和MSSQL,我们可以轻松地开发出一个简单而功能强大的数据库应用程序,本文所讲述的学生管理系统只是其中的一个示例。如果您需要开发更为复杂的数据库应用程序,可以参考本文所示的方法,并根据实际需求进行相应的调整。