自学上层应用访问数据库的方式(如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
这部分因为代码量比较大,所以只放了一些关键代码,完整代码链接在文末
软件开发流程图:
系统主界面展示:
- 浏览功能
- 连接数据库相关信息输入
- 其他功能子界面按钮
- 数据库数据展示区
- 交互终端区
系统功能展示——浏览功能
系统功能展示——信息录入功能
信息插入功能关键代码:
# 供应商表信息插入
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