文章目录
- 题目
- 数据库设计
- UI界面开发展示
原文链接:https://zhanghan.xyz/posts/60088/
题目
自学上层应用访问数据库的方式(如ODBC、ADO、JDBC、MySQLi或者其它),根据您使用的上层语言(不限语言(但要求与自己完成的文件管理数据实验开发语言一致)),不限数据库(除ACCESS,SQLite 以外),选择并学习使用一种合适的访问数据库的方式。
基于文件管理数据实现,实现使用关系数据库管理课本中 P70-6 题中 SPJ 数据库。功能包括:

开发环境说明:
Python3.6
Mysql 8.0.26
Navicat Premium 15
Pyqt5
Qt-designer
pymysql
数据库设计
有一个SPJ数据库,包括S、P、J及SPJ4个关系模式∶
S(SNO,SNAME,STATUS,CITY);
P(PNO,PNAME,COLOR,WEIGHT):
J(JNO.JINAME,CrITY);
SPJ(SNO,PNO,NO,QTY)。
供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市CITY组成。
零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT组成。
工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY组成。
供应情况表 SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(OTY组成,表示某供应商供应某种零件给某工程项目的数量为QTY。

4个数据库表构建代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `spj`()
BEGIN
-- 定义 S 表
CREATE TABLE S(Sno CHAR(10) PRIMARY KEY, Sname CHAR(10), Sstatus int CHECK (Sstatus in (10,20,30,40)), Scity CHAR(10)
);
INSERT INTO S(Sno, Sname, Sstatus, Scity) VALUES('S1', '精益', 20, '天津');
INSERT INTO S(Sno, Sname, Sstatus, Scity) VALUES('S2', '盛锡', 10, '北京');
INSERT INTO S(Sno, Sname, Sstatus, Scity) VALUES('S3', '东方红', 30, '北京');
INSERT INTO S(Sno, Sname, Sstatus, Scity) VALUES('S4', '丰泰盛', 20, '天津');
INSERT INTO S(Sno, Sname, Sstatus, Scity) VALUES('S5', '为民', 30, '上海');-- 定义 P 表
CREATE TABLE P(Pno CHAR(10) PRIMARY KEY,Pname CHAR(10),Pcolor CHAR(10),Pweight INT
);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P1', '螺母', '红', 12);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P2', '螺栓', '绿', 17);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P3', '螺丝刀', '蓝', 14);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P4', '螺丝刀', '红', 14);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P5', '凸轮', '蓝', 40);
INSERT INTO P(Pno, Pname, Pcolor, Pweight) VALUES('P6', '齿轮', '红', 30);
SELECT * FROM P;
-- 定义 J 表
CREATE TABLE J(Jno CHAR(10) PRIMARY KEY, Jname CHAR(10) UNIQUE, Jcity CHAR(10)
);
INSERT INTO J(Jno, Jname, Jcity) VALUES('J1', '三建','北京');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J2', '一汽','长春');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J3', '弹簧厂','天津');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J4', '造船厂','天津');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J5', '机车厂','唐山');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J6', '无线电厂','常州');
INSERT INTO J(Jno, Jname, Jcity) VALUES('J7', '半导体厂','南京');
SELECT * FROM J;
-- 定义 SPJ 表
CREATE TABLE SPJ(Sno CHAR(10),Pno CHAR(10),Jno CHAR(10),QTY INT,PRIMARY KEY (Sno, Pno, Jno),FOREIGN KEY (Sno) REFERENCES S(Sno),FOREIGN KEY (Pno) REFERENCES P(Pno),FOREIGN KEY (Jno) REFERENCES J(Jno)
);
INSERT INTO SPJ VALUES('S1', 'P1', 'J1', 200);
INSERT INTO SPJ VALUES('S1', 'P1', 'J3', 100);
INSERT INTO SPJ VALUES('S1', 'P1', 'J4', 700);
INSERT INTO SPJ VALUES('S1', 'P2', 'J2', 100);
INSERT INTO SPJ VALUES('S2', 'P3', 'J1', 400);
INSERT INTO SPJ VALUES('S2', 'P3', 'J2', 200);
INSERT INTO SPJ VALUES('S2', 'P3', 'J4', 500);
INSERT INTO SPJ VALUES('S2', 'P3', 'J5', 400);
INSERT INTO SPJ VALUES('S2', 'P5', 'J1', 400);
INSERT INTO SPJ VALUES('S2', 'P5', 'J2', 100);
INSERT INTO SPJ VALUES('S3', 'P1', 'J1', 200);
INSERT INTO SPJ VALUES('S3', 'P3', 'J1', 200);
INSERT INTO SPJ VALUES('S4', 'P5', 'J1', 100);
INSERT INTO SPJ VALUES('S4', 'P6', 'J3', 300);
INSERT INTO SPJ VALUES('S4', 'P6', 'J4', 200);
INSERT INTO SPJ VALUES('S5', 'P2', 'J4', 100);
INSERT INTO SPJ VALUES('S5', 'P3', 'J1', 200);
INSERT INTO SPJ VALUES('S5', 'P6', 'J2', 200);
INSERT INTO SPJ VALUES('S5', 'P6', 'J4', 500);SELECT * FROM S;
END
UI界面开发展示
这部分因为代码量比较大,所以只放了一些关键代码,完整代码链接在文末
软件开发流程图:

系统主界面展示:

- 浏览功能
- 连接数据库相关信息输入
- 其他功能子界面按钮
- 数据库数据展示区
- 交互终端区
系统功能展示——浏览功能

系统功能展示——信息录入功能

信息插入功能关键代码:
# 供应商表信息插入
self.insert_S = "INSERT INTO S(Sno,Sname,Sstatus,Scity) VALUES (\"{}\",\"{}\",\"{}\",\"{}\");".format(SNO,Sname,Sstatus, Scity)
self.SQL_exe(self.insert_S)
# 供应商情况表信息插入
self.insert_SPJ = "INSERT INTO SPJ(Sno,Pno,Jno,QTY) VALUES (\"{}\",\"{}\",\"{}\",\"{}\");".format(Sno,Pno,Jno, QTY)
self.SQL_exe(self.insert_SPJ)
系统功能展示——信息查询功能

信息查询功能关键代码:
self.select_SNO = "SELECT Sno,Sname,Sstatus,Scity FROM s WHERE SNO=\"{}\";".format(self.SELECT_SNO)
self.read(self.select_SNO)
系统功能展示——信息删除、查询功能

信息删除功能关键代码:
# 删除顺序很重要
self.delete_spj = "DELETE FROM SPJ WHERE SNO=\"{}\";".format(self.delete_SNO)
self.delete_s = "DELETE FROM S WHERE SNO=\"{}\";".format(self.delete_SNO)
self.read(self.delete_spj)
self.read(self.delete_s)
信息修改功能关键代码:
self.update_spj = "UPDATE SPJ SET QTY=QTY*1.1 WHERE SNO=\"{}\";".format(self.update_SNO)
self.read(self.update_spj)
系统功能展示——特殊情况触发

完整代码链接:https://gitee.com/zhgn2020814/small-database-management.git


















