学生管理数据库系统开发实例分析

简介: 学生管理数据库系统开发实例分析

学生管理数据库系统开发实例分析


数据说明


通过一个学生管理数据库系统的开发过程来展示如何系统地基于Python实现SQLite数据库编程。首先提出数据库系统的基本结构,以及如何通过SQLite逐步达到这些要求并进行常规操作。


  • 该学生管理数据库系统包括四张表:专业表、学生表、课程表和成绩表;
  • 实现对学生信息、专业信息、课程信息和成绩的综合管理。

(1)专业表 专业表包括专业编号和专业名称两个列,具体设置见如下表。

image.png

(2)学生表 学生表包括学号、姓名、性别、生日、专业编号、奖学金、党员、照片和备注等列,具体设置见如下表。其中,学生表中的专业编号以专业表中的专业编号作为外键,实施参照完整性。

image.png

(3)课程表 课程表包括课程号、课程名称、先修课程代码、学时和学分等列,具体设置如下表。

image.png

(4)成绩表 成绩表包含三列:学号、课程号和成绩,具体设置如下表。其中,学号和课程号共同构建为主键。同时,该表中的学号以学生表的学号作为外键,课程号以课程表中的课程号作为外键,实施参照完整性。

image.png


2.数据准备


为了规范数据输入,分别用4个txt文档存储4张表原始数据。文档中的数据组织形式为:列1值,列2值,…。以专业表为例,在对应的txt文档中,数据组织形式如下: 01,国际经济与贸易 02,工商管理 … 16,第二学位班 因此,在构建好相应的数据表结构之后,可方便地编写函数统一将txt文档中的数据导入到对应数据表中。


3.关键函数


为了减少数据库系统构建过程中代码的重复,应将可能重复执行的代码包装成函数。本系统开发中构建了以下函数: (1)数据表创建及数据导入函数:create_table; (2)数据表结构查询函数:table_struct; (3)数据表记录查询函数:table_quer。


4.数据库系统构建代码实现


# coding=utf-8
import sqlite3
conn = sqlite3.connect('Shift_MIS.db')
cur = conn.cursor()
cur.execute("PRAGMA foreign_keys=ON")
# 构建数据表创建及文本数据导入函数
def create_table(tab_name, col_prop_list, txt_path, conn=conn, cur=cur):
    col_name_props = ','.join(col_prop_list)
    cur.execute('CREATE TABLE IF NOT EXISTS %s(%s)'%(tab_name,col_name_props))
    f = open(txt_path,'r')
    for x in f:
        x = x.rstrip().split(',')
        a = [ "'%s'" % x[i]  for i in range(len(x))]
        x = ','.join(a)
        cur.execute('INSERT INTO %s values(%s)'%(tab_name,x))
    f.close()
    print('%s创建成功' % tab_name)
    print('    %s导入成功' % txt_path)
    conn.commit()
# 构建数据表结构查询函数
def table_struct(tab_name, cur=cur):
    cur.execute("PRAGMA table_info(%s)" % tab_name)
    t_struct = cur.fetchall()
    for item in t_struct:
        for x in item:
            x = str(x)
            print(x, sep='\t', end=' ')
        print()
# 构建数据表内容查询函数
def table_quer(tab_name, col_names='*', num_line=None, cur=cur):
    cur.execute('select %s from %s' % (col_names, tab_name))
    Li = cur.fetchall()
    for line in Li[:num_line]:
        for item in line:
            print(item, sep='\t', end=' ')
        print()
if __name__ == '__main__':
    #(1)创建专业表
    tab_name_1 = '专业表'
    col_prop_list_1 = ['专业编号 varchar(7) primary key',
                               '专业名称 varchar(7)']
    txt_path_1 ='专业表.txt'
    create_table(tab_name_1,col_prop_list_1,txt_path_1)
    #(2)创建学生表
    tab_name_2 = '学生表'
    col_prop_list_2 = ['学号 varchar(7) primary key',
                                '姓名 varchar(7)',
                                '性别 tinyint',
                                '生日 text NULL',
                                '专业编号 varchar(7) REFERENCES 专业表(专业编号) ON UPDATE CASCADE ON DELETE CASCADE',
                                '奖学金 numeric NULL',
                                '党员 tinyint NULL',
                                '照片 blob NULL',
                                '备注 text NULL']
    txt_path_2 = '学生表.txt'
    create_table(tab_name_2, col_prop_list_2, txt_path_2)
    # (3) 创建课程表
    tab_name_3 = '课程表'
    col_prop_list_3 = ['课程号 varchar(7) primary key',
                                '课程名称 varchar(7) NULL',
                                '先修课程代码 varchar(7) NULL',
                                '学时 smallint', '学分 smallint']
    txt_path_3 = '课程表.txt'
    create_table(tab_name_3, col_prop_list_3, txt_path_3)
    #  (4)创建成绩表
    tab_name_4 = '成绩表'
    col_prop_list_4 = ['学号 varchar(7) REFERENCES 学生表(学号) ON UPDATE CASCADE ON DELETE CASCADE',
                               '课程号 varchar(7) REFERENCES 课程表(课程号) ON UPDATE CASCADE ON DELETE CASCADE',
                               '成绩 smallint NULL',
                               'PRIMARY KEY (学号,课程号)']
    txt_path_4 = '成绩表.txt'
    create_table(tab_name_4,col_prop_list_4,txt_path_4)


5.数据库系统构建结果


image.png


6.数据库操作


首先,查询数据库中所有的数据表。

#首先,查询数据库中所有的数据表。
for x in cur.execute("select name from sqlite_master where type = 'table' order by name").fetchall():
print(x[0])
#查询专业表的结构及前10行内容。
table_struct('专业表')
table_quer('专业表', col_names='*', num_line=10)=
#综合查询。以下查询语句的执行将返回国际贸易法课程成绩小于60的学生的学号、姓名、课程名称和成绩,并按学号的升序排列。
>>> cur.execute('''SELECT 学生表.学号,学生表.姓名,课程表.课程名称,成绩表.成绩
               FROM 学生表 JOIN 成绩表 JOIN 课程表 
               ON 学生表.学号=成绩表.学号 AND 课程表.课程号=成绩表.课程号  
               WHERE 成绩表.成绩 < 60 and 课程表.课程名称=’国际贸易法’
ORDER BY 学生表.学号 ASC''')
>>> for line in cur.fetchall():
    for x in line:
        print(x, sep='\t', end= ' ')
print


目录
相关文章
|
2天前
|
存储 NoSQL MongoDB
使用mongodb数据库实例
【5月更文挑战第9天】MongoDB中的集合类似关系数据库的表,但不强制模式,允许嵌入式文档以实现更灵活的数据布局。安装MongoDB在Ubuntu上涉及添加源列表和更新,CentOS则需创建配置文件。MongoDB支持备份和恢复,以及全文搜索。其灵活模式和动态模式减少了开发中的复杂性,但并非无模式,大部分数据仍具结构化特点。
80 2
|
3天前
|
存储 缓存 NoSQL
NoSQL缓存数据库的使用场景实例和命令速查表
【5月更文挑战第8天】Redis 是一个内存数据结构服务,用 C 编写,支持五种数据结构,不仅限于键值对。它用于缓存、消息队列、订阅/发布系统等,提供持久化、主从复制和集群支持。了解其核心数据结构和应用场景是有效利用 Redis 的关键。
54 3
NoSQL缓存数据库的使用场景实例和命令速查表
|
6天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
16 2
|
6天前
|
SQL XML 存储
Microsoft Access 是微软公司开发的关系型数据库管理系统(
【5月更文挑战第14天】Microsoft Access 是微软公司开发的关系型数据库管理系统(
14 1
|
6天前
|
存储 人工智能 NoSQL
现代数据库技术演进与应用前景分析
本文探讨了现代数据库技术的演进历程及其在各领域的应用前景。首先介绍了传统数据库的局限性,随后分析了NoSQL、NewSQL以及分布式数据库等新兴技术的特点和优势。接着探讨了人工智能、物联网、大数据等领域对数据库技术提出的新要求,并展望了未来数据库技术的发展趋势与应用前景。
|
6天前
|
分布式计算 Java 关系型数据库
|
6天前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
12 0
|
6天前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
11 0
|
6天前
|
Java 关系型数据库 MySQL
springboot业务开发--springboot一键生成数据库文档
Screw是一个数据库文档生成工具,能自动化根据数据库表结构生成文档,减轻开发人员工作负担,支持MySQL、MariaDB、TiDB等多种数据库和HTML、Word、Markdown等格式。它依赖HikariCP数据库连接池和Freemarker模板引擎。通过在Spring Boot项目中添加相关依赖并配置,可以用代码或Maven插件方式生成文档。示例代码展示了如何在JUnit测试中使用Screw生成HTML文档。
|
6天前
|
存储 搜索推荐 数据库
如何选择合适的矢量数据库:选型指南与案例分析
【4月更文挑战第30天】面对众多矢量数据库,如何选择合适的?本文提供了一份选型指南和案例分析。首先,明确业务需求,如推荐系统、图像检索等场景的不同需求;其次,评估数据量,大型项目需选择支持分布式架构的数据库;再者,关注查询性能、技术成熟度和成本。案例中,电商企业选用Faiss实现高效推荐,而互联网公司则因大规模图像检索选择了Milvus,后者以其扩展性和准确性脱颖而出。选择矢量数据库需综合考虑,结合实际以找到最佳匹配。