使用PyQt5开发MSSQL数据库应用

使用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,我们可以轻松地开发出一个简单而功能强大的数据库应用程序,本文所讲述的学生管理系统只是其中的一个示例。如果您需要开发更为复杂的数据库应用程序,可以参考本文所示的方法,并根据实际需求进行相应的调整。

数据库标签