数据库上机3(小型数据库应用程序开发)

article/2025/11/5 6:34:47

注:

①各上机报告均根据《数据库技术与应用》课程的上机任务所做。

②课程教材为 《数据库系统概论(第五版)》/王珊, 萨师煊编著/北京:高等教育出版社,2014

上机要求:

1、自学上层应用访问数据库的方式(如ODBCADOJDBC或者其它),根据您使用的上层语言(不限语言(但要求与自己完成实验一开发语言一致),不限数据库(除ACESS以外),选择并学习使用一种合适的访问数据库的方式。

2、基于1,实现第五版教材中9页的[]。注意实现时使用两个表存放数据——学生基本信息表和奖励表,表具有相应的完整性约束。程序功能与用文件系统存储和管理这些数据所需实现的数据操作功能相同(即实验一中要求的功能与约束)

3对比文件系统与数据库系统实现相同功能操作时,各自优缺点

4、要求实验三与实验一界面相同。

 

具体实现:

所用DBMS为MySQL,上层开发语言为Python

 

import pymysql    #python连接mysql的驱动
import tkinter as tk    #图形化界面的模块
import tkinter.ttk as ttk
import tkinter.messagebox  # 要使用messagebox先要导入模块table1 = "sbasicinf"
table2 = "srewardinf"#建立连接,在每个按钮的函数里创建游标
db = pymysql.Connect(host = "127.0.0.1", user = "root", passwd = "QAZwsxedc123@", db = "elective", port = 3306, charset ='utf8')    #括号内的“db =”虽然此处标为数据库名称,但实际为模式(SCHEMA)名称def clearAll():entryId.delete(0, 'end')entryName.delete(0, 'end')entryMaj.delete(0, 'end')entryRew.delete(0, 'end')spinboxSex.delete(0, 'end')spinboxAge.delete(0, 'end')def search():cursor = db.cursor()name = entryName.get()id = entryId.get()if(id != ''):try:id = int(id)sql1 = "select * from {} where Sno = {}".format(table1, id)cursor.execute(sql1)a = cursor.fetchone()if(a != None):      #此处将a换为cursor.fetchone()不行。原因待日后补充list1 = []for value in a:print(value)list1.append(value)sql2 = "select Srew from {} where Sno = {}".format(table2, id)cursor.execute(sql2)list1.append(cursor.fetchone()[0])tk.messagebox.showinfo(title='Info', message=tuple(list1))else:tk.messagebox.showerror(title='错误!', message='查无此人!请重新输入!')except:tk.messagebox.showerror(title='错误!', message='输入错误!请重新输入!')elif(id == '' and name != ""):sql1 = "select * from {} where Sname = \"{}\"".format(table1, name)cursor.execute(sql1)a = cursor.fetchall()if (a != ()):   #如果未查询到结果,返回一个空元组()list1 = []for value in a:value = list(value)list1.append([*value])sql2 = "select Srew from {} where Sname = \"{}\"".format(table2, name)cursor.execute(sql2)i = 0for value in cursor.fetchall():value = list(value)list1[i].append(value[-1])list1[i].append('\n')i += 1tk.messagebox.showinfo(title='Info', message = list1)else:tk.messagebox.showerror(title='错误!', message='查无此人!请重新输入!')clearAll()cursor.close()
#!!!python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。
def insert():cursor = db.cursor()id = entryId.get()name = entryName.get()sex = spinboxSex.get()age = spinboxAge.get()maj = entryMaj.get()rew = entryRew.get()if (id != ''):try:id = int(id)sql = "select * from {} where Sno = {}".format(table1, id)cursor.execute(sql)if(cursor.fetchone() != None):tk.messagebox.showerror(title='错误!', message='已有此人!请重新输入!')else:sql1 = "insert into {} values({}, \"{}\", \"{}\", {}, \"{}\")".format(table1, id, name, sex, age, maj)cursor.execute(sql1)sql2 = "insert into {} values({}, \"{}\", \"{}\")".format(table2, id, name, maj)cursor.execute(sql2)tk.messagebox.showinfo(title='Info', message='添加成功!')except:tk.messagebox.showerror(title='错误!', message='输入错误!请重新输入!')else:tk.messagebox.showerror(title='错误!', message='学号不能为空!请重新输入!')db.commit()clearAll()cursor.close()def alter():cursor = db.cursor()id = entryId.get()if(id != ''):try:id = int(id)sql = "select * from {} where Sno = {}".format(table1, id)cursor.execute(sql)if(cursor.fetchone() != None):sex = spinboxSex.get()sql = "update {} set Ssex = \"{}\" where Sno = {}".format(table1, sex, id)cursor.execute(sql)tk.messagebox.showinfo(title = 'Info', message='修改成功')else:tk.messagebox.showerror(title='错误!', message='查无此人!请重新输入!')except:tk.messagebox.showerror(title='错误!', message='输入错误!请重新输入!')else:tk.messagebox.showerror(title='错误!', message='学号不能为空!请重新输入!')db.commit()clearAll()cursor.close()def delete():cursor = db.cursor()id = entryId.get()if(id != ''):try:id = int(id)sql = "select * from {} where Sno = {}".format(table1, id)cursor.execute(sql)if(cursor.fetchone() != None):sql1 = "delete from {} where Sno = {}".format(table1, id)cursor.execute(sql1)sql2 = "delete from {} where Sno = {}".format(table2, id)cursor.execute(sql2)tk.messagebox.showinfo(title = 'Info', message='删除成功')else:tk.messagebox.showerror(title='错误!', message='查无此人!请重新输入!')except:tk.messagebox.showerror(title='错误!', message='输入错误!请重新输入!')else:tk.messagebox.showerror(title='错误!', message='学号不能为空!请重新输入!')db.commit()clearAll()cursor.close()#控件的布局
windows = tk.Tk()
windows.title('学生信息管理')
#第1行控件
lblId = tk.Label(text = '学号:')
lblId.grid(row = 0, column = 0)
entryId = tk.Entry()
entryId.grid(row = 0, column = 1)
lblName = tk.Label(text = '姓名:')
lblName.grid(row = 0, column = 2)
entryName = tk.Entry()
entryName.grid(row = 0, column = 3)
#第2行控件
lblSex = tk.Label(text = '性别:')
lblSex.grid(row = 1, column = 0)
spinboxSex = tk.Spinbox(windows, value = ('男', '女'))
spinboxSex.grid(row = 1, column = 1)
lblAge = tk.Label(text = '年龄:')
lblAge.grid(row = 1, column = 2)
spinboxAge = tk.Spinbox(windows, from_ = 15, to = 40)
spinboxAge.grid(row = 1, column = 3)
#第3行控件
lblMaj = tk.Label(text = '专业:')
lblMaj.grid(row = 2, column = 0)
entryMaj = tk.Entry()
entryMaj.grid(row = 2, column = 1)
lblRew = tk.Label(text = '奖励:')
lblRew.grid(row = 2, column = 2)
entryRew = tk.Entry()
entryRew.grid(row = 2, column = 3)
#分割线
ttk.Separator(orient=tk.HORIZONTAL).grid(row=3, column=0,columnspan=6,pady=10,sticky=tk.W+tk.E)
#按钮控件
btnSer = tk.Button(text = '查询', command = search)
btnSer.grid(row = 4, column = 0)
btnIdx = tk.Button(text = '插入', command = insert)
btnIdx.grid(row = 4, column = 1)
btnRep = tk.Button(text = '修改', command = alter)
btnRep.grid(row = 4, column = 2)
btnDel = tk.Button(text = '删除', command = delete)
btnDel.grid(row = 4, column = 3)windows.mainloop()

关系模式结构:

sbasicinf(Sno,Sname,Ssex,Sage,Sdept)

srewardinf(Sno,Sname,Srew)

sbasicinf表
属性名类型是否为主码是否允许空
Snochar(8)
Snamechar(10)
Ssex

char(2)

Sagesmallint
Sdeptchar(10)

srewardinf表

属性名类型是否为主码是否允许空
Snochar(8)
Snamechar(10)
Srew

varchar(200)

 

完成的功能:

  1. 按学号、姓名查询
  2. 插入新的学生信息
  3. 按学号修改性别
  4. 删除学生信息

连接:

①连接数据库,Connect函数及其参数

  • host: mysql服务器地址
  • port: 数字类型 端口
  • user: 用户名
  • passwd: 密码
  • db: 数据库名称          //虽然此处标为数据库名称,但实际为模式(SCHEMA)名称    
  • charset: 连接编码,需要显式指明编码方式

②在每个按钮触发函数的开始建立游标,结尾关闭游标

③fetchone()  返回一条查询结果,fetchall()  返回所有查询结果       //从游标处开始

④close()关闭游标/关闭数据库连接

运行截图:

1.按姓名查询

 

 

与文件方式管理的区别:

  • 以文件方式管理时需要自己设计如何存放数据(例如,excel中的第x行,第y列),用数据库管理时不需要。
  • 以文件方式管理时需要自己根据存储坐标进行操作,调试时容易出现差错。而数据库管理时仅需要选择操作的类型和数据,DBMS会自动完成。

 

系统的问题与不足:

每次运行程序前必须保证数据库已经连接(例如,打开MySQL Workbench建立连接①)之后即使关闭(MySQL Workbench),程序依旧可以运行(②)

问题①的原因未知,待日后补充

问题②是因为程序里并没有关闭数据库连接的语句

问题③由于MySQL不支持check约束,我原打算使用控件Spinbox,但它只能限制选择时的取值并不能限制输入的取值。


http://chatgpt.dhexx.cn/article/XKNLGFKp.shtml

相关文章

【SQL数据库设计】数据库设计【小型数据库】

数据库设计 需求 表结构字段类型、是否允许为null、是否有默认值索引设计数据库引擎的选择 根据产品原型分析,词性分析法,名词创建表或字段,动词表示关系。 数据存储:长期存储的数据, 1.主键:唯一、自增。 …

小型数据库系统开发作业

文章目录 题目数据库设计UI界面开发展示 原文链接:https://zhanghan.xyz/posts/60088/ 题目 自学上层应用访问数据库的方式(如ODBC、ADO、JDBC、MySQLi或者其它),根据您使用的上层语言(不限语言(但要求与自…

关于Freesurfer提取annotation分区结构特征的命令mri_segstats

Freesurfer提供了基于分区模板提取常规特征(area, volume, thickness, thicknessstd, meancurv, gauscurv, foldind, curvind)的指令mris_anatomical_statsaparcstats2table还有可以提取从fMRI或DWI产生的结果以及一些特殊的结构特征(如LGI&a…

Linux下使用Freesurfer的两种方法

文章目录 1. 直接在终端使用准备工作开始运行 2. 通过调用python文件使用 1. 直接在终端使用 重点:Freesurfer安装完成后,需要在相同的用户名下运行,并且所有文件数据也要放在此用户下 放在其他地方可能会因为没有权限而运行失败 官网流程说…

freesurfer入门-试图理解freesurfer输出的数据

因为一些原因想要学习使用freesurfer,虽然照着tutorial跑了起来但是完全不知道跑出来的是个啥,所以准备弄一篇文章记录每个部分是干啥的,此文为记录 能记多少是多少吧… FreeSurfer内数据 labelmriorgtransforms scriptsstatssurf 首先要提一下比较常见的两个词:lh和rh 如果我没…

FreeSurfer入门(1) Output Data

目录 前言一、使用freeview查看卷二、使用freeview查看3D surfacePial surfacewhite surfaceInflated SurfaceThickness MapCortical Parcellation 前言 因一些原因需要学习FreeSurfer,然而教程比较少有些难懂,看了一段时间觉得可能要钻钻牛角尖才可以完成学习,所以开始记笔记…

IXI数据预处理 + Linux + freesurfer

目录 1. freesurfer下载安装测试1.1 下载受阻,安装axel-2.4,多线程下载1.2 安装1.3 安装时出现的问题1.4 测试1.5 使用前注意 2. freesurfer 处理IXI2.1 freesurfer 的使用2.2 从零开始处理IXI2.2.1 命令行skull_stripping 单个.nii文件2.2.2 分析处理完成后的文件2…

Freesurfer的简单使用和一些基础知识

Freesurfer Freesurfer是用于MRI图像处理和分析的一款开源软件,可进行多种模态数据的预处理,皮层重建,volume与surface的互相之间的配准等。 MRI成像 https://www.csdn.net/tags/Mtzagg1sNzM3MTMtYmxvZwO0O0OO0O0O.html MRI成像原理&…

FreeSurfer汉化教程

介绍FsFAST的预处理 根据官网的英文进行翻译,并在使用过程中所犯的错误进行解决的过程 介绍Tutorial Data 下载以及安装 安装 安装Tutorial Datasets 从教程数据,创建文件tutorial_data在自己的工作路径中。 curl https://surfer.nmr.mgh.harvard.e…

Freesurfer教程(ubuntu)

Freesurfer教程(ubuntu) 参考链接:http://www.wjhsh.net/zhhfan-p-13405572.html 1.安装 freesurfer的安装教程各个网站上都用详细的过程,这里不再叙述 这个命令是在处理tutorial_data中的dcm数据时使用的:recon-al…

freeSurfer颅骨剥离

命令参考 https://surfer.nmr.mgh.harvard.edu/fswiki/recon-all recon-all -i 输入文件路径.nii -s 创建用于保存文件夹名称 -sd 保存文件夹所在的目录 -命令 -autorecon2-cp 输入输出参考 https://surfer.nmr.mgh.harvard.edu/fswiki/ReconAllDevTable orig/001.mgz 将…

freesurfer使用

一.做灰白质分割 我的目的是得到某被试的脑白质mask。 1.首先找了freesurfer教程,直接打开了freeview; 2.可视界面中没有直接的wmseg功能; 3.去使用freeview的手册查询wmseg(开始怀疑这种操作不叫该名词..)&#x…

【freesurfer学习1】freesurfer结构像批处理

freesurfer结构像批处理 最近0基础新入脑科学的坑,在等待申请数据集的时候,顺便学习一下freesurfer。 软件的安装稍后在评论区补上。 recon-all 分割重建 在我自定义的重建文件夹recon下有test文件夹,有两个文件夹demo1dcmnii,…

FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程

FreeSurfer当前只支持Linux系统和Mac OS。我所使用的系统是Ubuntu 16 .0.4,FreeSurfer的安装耗时较小,但是在处理时耗时较长,可能需要数个小时,甚至一天,这个取决于机器性能,但是和GPU好像没太大关系。下面…

FreeSurfer的安装及使用(个人踩坑记录)

一、环境要求 目前只支持在Linux和MacOS系统,虽然可以用 -parallel 进行多线程处理,但基本消耗的是CPU内存。 二、FreeSurfer的下载与安装 1. 下载安装包 官网链接:rel7downloads - Free Surfer Wiki 根据自己系统型号下载对应安装包&am…

【数学建模】统计回归模型

一、 多元线性回归 matlab统计工具箱 [b,bint,rint,stats]regress(y,x,alpha) 输入 y~n维数据向量数据矩阵,第1列为全1向量alpha(置信水平,0.05) 输出 b~β的估计值bint~b的置信区间r~残差向量y-xbrint~r的置信区间(置信区间包含0则对y的影响不太显…

统计学习模型——决策树

决策树学习的三个步骤:特征选择、决策树的生成和决策树的修剪 一、决策树模型(分类与回归方法) 1.1 基本概念 决策树可为多叉树,是描述对实例进行分类的树形结构决策树由结点和有向边组成。其中结点又分为:内部结点…

机器学习的概率统计模型(附代码)(一)

目录 概率论 1.1 离散随机变量分布 1)伯努利分布 2)二项分布 3)泊松分布 1.2 连续随机变量分布 1)均匀分布 2)指数分布 3)正态分布 总结 系列文章目录 概率论 概率论,是研究随机现象数量规…

【统计模型】缺失数据处理方法

目录 一、缺失数据定义 二、缺失数据原因 三、缺失数据处理步骤 四、数据缺失机制 1.完全随机缺失(MCAR) 2.随机缺失(MAR) 3.非随机、不可忽略缺失(NMAR) 五、缺失数据处理方法 1.直接删除 2.缺失值…

数学统计建模

数据预处理 数据清洗 无量纲处理 检验数据来自哪个分布 正态分布检验 K-S检验的P值检验正态性 非正态数据处理 数据偏态处理 BOX-COX变换 成分数据处理 clr变换 ilr变换 logit变换 属性数据 相关性检验 假设检验方法使用时应首先判断数据是否为正态数据。如果是&#x…