用Python做一个疫苗接种管理数据库

前言

那一年过年前,疫情开始爆发,对全国人民的生活和工作造成了严重的影响。但凭借着国家强盛的实力,新冠疫苗也很快的被技术人员研发出来,人们通过接种新冠疫苗来抵御新冠病毒的危害。本次通过接种新冠疫苗的这个数据统计,来设计“疫苗接种数据库”,存储人们接种疫苗的相关信息,并实现“增删改查”等基本操作以及其他的拓展功能。(文末送福利

国内新冠疫苗人员接种后,如果不通过数据统计到数据库,数据量之大,数据查询,数据核实,数据更改等工作会非常不方便,通过编程语言,设计疫苗接种数据库,来存储接种疫苗相关数据,能使得工作人员和接种人员的工作量大大减少,从而减少工作负担,节省时间,减少更多的财力损失,实现更好的数据管理,是一种非常高效、精确、快捷、方便的方式。

数据库信息

本次数据库设计一共四张表,分别为《接种人员(person)》、《生产厂家(manufacturer)》、《疫苗信息(vaccine)》、《接种信息(inject_info)》。

《接种人员》表的数据项:姓名,身份证号,生日,性别,家庭住址,联系电话,不良反应。
《生产厂家》表的数据项:厂家名称,厂家编号,厂家地址,联系人,联系人电话。
《疫苗信息》表的数据项:疫苗名称,疫苗编号,疫苗品种,疫苗厂家编号,生产日期,过期时间。
《接种信息》表的数据项:接种编号,接种疫苗编号,疫苗品种,接种剂次,接种人姓名,接种人身份证号,接种时间,接种单位。

主要阶段

确定选题:《课程设计-疫苗接种数据库》。
需求分析:《数据库数据字典》,编程语言为:python + mysql
我还给大家准备了这些资料:Python视频教程、100本Python电子书、基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题、Python学习路线图、问题解答!点击有道云笔记即可领取~

有道云笔记
二、关键代码展示

1、app.py(主函数)

if __name__ == '__main__':
    # 全局变量初始化
    gol._init()
 
    # # 课题背景信息
    # menu.course_background()
    #
    # # 打印小组成员信息
    # menu.team_info()
 
    # 连接数据库信息
    db.connect_to_db(config.db_host, config.db_user, config.db_password, config.db_name)
 
    # 跳出数据库的标志 
    flag = True
    while (flag):
        menu.main_menu()
        cin = input("请输入要执行操作:")
 
        choice = int(cin) if cin.isdigit() else config.DEFAULT_INPUT
 
        if choice == 0:
            print("您已选择退出,感谢您的操作体验")
            break
        elif choice == config.OP_TYPE_ADD:
            # ----------------------添加----------------------------
            mgr_add.add_data()
            print(config.END_OP_TEXT)
            input()
 
        elif choice == config.OP_TYPE_DELETE:
            # ----------------------删除----------------------------
            mgr_delete.do_delete()
            print(config.END_OP_TEXT)
            input()
 
        elif choice == config.OP_TYPE_SELECT:
            # ----------------------查找----------------------------
            mgr_selector.do_select()
            print(config.END_OP_TEXT)
            input()
 
        elif choice == config.OP_TYPE_UPDATE:
            # ----------------------修改----------------------------
            mgr_update.do_update()
            print(config.END_OP_TEXT)
            input()
        else:
            print("操作选项输入错误,请重新输入")
 
    db.close_db_link()
2、mgr_update.py(更新)

def do_update():
    menu.update_menu_total()
 
    cin = util.get_user_input(5)
 
    if cin == 0:
        return
    if cin == config.TYPE_1:
        do_update_person()
 
    if cin == config.TYPE_2:
        do_update_inject_info()
 
    if cin == config.TYPE_3:
        do_update_vaccine()
 
    if cin == config.TYPE_4:
        do_update_manufacturer()
 
 
def do_update_person():
    # 更新接种人员表
 
    menu.update_menu_1()
 
    cin_update = util.get_user_input(4)
 
    if cin_update == 0:
        return
 
    # 根据身份证号更新
    cert_no = input("请输入身份证号:")
 
    table = config.table_dict[config.TYPE_1]
    table_inject_info = config.table_dict[config.TYPE_2]
 
    if cin_update == 1:
        # 更新姓名
        new_name = input("请输入修改后的姓名:")
        sql1 = "UPDATE %s SET name='%s' WHERE cert_no='%s';" % (table, new_name, cert_no)
        sql2 = "UPDATE %s SET person_name='%s' WHERE person_cert_no='%s';" % (table_inject_info, new_name, cert_no)
        db.execute_sql(sql1)
        db.execute_sql(sql2)
 
    elif cin_update == 2:
        # 更新电话
        new_phone = input("请输入修改后的接种人联系电话:")
        sql1 = "UPDATE %s SET phone='%s' WHERE cert_no='%s';" % (table, new_phone, cert_no)
        db.execute_sql(sql1)
 
    elif cin_update == 3:
        # 更新住址
        new_address = input("请输入修改后的家庭住址:")
        sql1 = "UPDATE %s SET address='%s' WHERE cert_no='%s';" % (table, new_address, cert_no)
        db.execute_sql(sql1)
3、mgr_add.py(添加)

def add_data():
    # 添加操作
    add_menu_1()
 
    # 获取用户输入
    cin = util.get_user_input(5)
 
    if cin == 0:
        return
 
    # 获取数据表列
    table = config.table_dict[cin]
    columns = get_table_col(table)
 
    util.print_log("表的列信息: ",  columns)
 
    field_list = []
    data_list = []
    for i in columns:
        col_name = i[0]     # 列名
        col_type = i[1]     # 列类型
        col_index_type = i[4]     # 列索引类型
        col_desc = i[8]     # 列值
 
        # 如果是不需要录入则跳过, 比如 id,person_id 等
        if(col_name in config.SKIP_FIELD_SET):
            continue
 
        util.print_log("当前列信息", i)
 
        # 输入值
        if col_type == config.FIELD_TYPE_DATETIME:
            # 日期检查
            a = input("请输入【%s】, 例如 2022-05-02 : " % col_desc)
            input_data_invalid = True
            while(input_data_invalid):
                if(util.is_valid_date(a) == True):
                    break
                a = input("您输入日期不合法,请重新输入,例如 2022-05-02 : ")
        else:
            a = input("请输入【%s】: " % col_desc)
 
        # 判断唯一关键字是否重复
        if col_index_type == 'UNI':
            sql = '''
                SELECT 1 FROM  %s  
                WHERE %s = %s 
            ''' % (table, col_name, a)
            util.print_log("查重 sql: ", sql)
            cursor = gol.get_value('cursor')
            exist_in_table = 1
            while exist_in_table == 1:
                dup_result = cursor.execute(sql)
                if dup_result == 0:
                    break
 
                # 如果重复则重新输入
                a = input("您输入与表中信息重复,请重新输入【%s】" % col_name)
 
        field_list.append(col_name)
        data_list.append(a)
 
    # 输入完成,组装数据
    field_str = ",".join(field_list)
    data_tuple = tuple(data_list)
 
    # 拼接数据
    sql = '''
        INSERT INTO %s(%s) VALUES %s;
    ''' % (table, field_str, data_tuple)
    util.print_log(sql)
 
    cursor = gol.get_value('cursor')
    cursor.execute(sql)
 
    # 提交数据
    conn = gol.get_value('conn')
    conn.commit()
 
    util.print_log("%s 表成功插入数据 %s" % (table, data_tuple))
    return 0
4、mgr_delete.py(删除)

def do_delete():
    # 删除操作
    menu.delete_menu_total()
 
    # 获取输入
    cin = util.get_user_input(5)
 
    if cin == 0:
        return
 
    if cin == config.TYPE_1:
        do_delete_person()
 
    if cin == config.TYPE_2:
        do_delete_inject_info()
 
    if cin == config.TYPE_3:
        do_delete_vaccine()
 
    if cin == config.TYPE_4:
        do_delete_manufacturer()
 
 
def do_delete_vaccine():
    # 删除疫苗信息
 
    # 打印菜单
    menu.delete_menu_3()
 
    # 获取用户输入
    cin = util.get_user_input(2)
    if cin == 0:
        return
 
    delete_value = input("请输入具体信息:")
 
    # 获取相关表
    table = config.table_dict[config.TYPE_3]
    table2 = config.table_dict[config.TYPE_2]
 
    # 接种编号
    if cin == 1:
        sql1 = '''
            DELETE FROM %s WHERE vaccine_no='%s' 
            ''' % (table, delete_value)
        sql2 = '''
            DELETE FROM %s WHERE vaccine_no='%s' 
            ''' % (table2, delete_value)
 
        db.execute_sql(sql1)
        db.execute_sql(sql2)
5、mgr_selector.py(查找)

def do_select():
    # 执行查询
    menu.select_menu_total()
 
    # 获取输入
    cin = util.get_user_input(5)
 
    if cin == 0:
        return
 
    if cin == config.TYPE_1:
        # ------------------查找接种人员相关信息----------------
        do_select_person()
 
    elif cin == config.TYPE_2:
        # ------------------查找接种信息-----------------------
        do_select_inject_info()
 
    elif cin == config.TYPE_3:
        # ------------------查找疫苗信息-----------------------
        do_select_vaccine()
 
    elif cin == config.TYPE_4:
        # ------------------查找生产企业相关信息-----------------------
        do_select_manufacturer()
 
 
def do_select_vaccine():
    # 查找疫苗信息
    menu.select_menu_3()
    cin = util.get_user_input(5)
 
    if cin == 0:
        return
 
    # 获取搜索数据
    cin2 = input("请输入搜索数据:")
 
    table = config.table_dict[config.TYPE_3]
    query_value = cin2
 
    # 结果集合
    result = []
 
    # 疫苗编号
    if cin == 1:
        result = db.query_by_table_field(table, 'vaccine_no', query_value)
 
    # 厂家编号
    if cin == 2:
        result = db.query_by_table_field(table, 'company_no', query_value)
 
    # 生产日期
    if cin == 3:
        sql = ''' 
            SELECT * FROM %s  WHERE %s >= '%s' 
            ''' % (table, 'production_at', query_value)
 
        cursor = gol.get_value('cursor')
        cursor.execute(sql)
        result = cursor.fetchall()
 
    # 过期时间
    if cin == 4:
        sql = ''' 
            SELECT * FROM %s  WHERE %s <= '%s' 
            ''' % (table, 'expired_at', query_value)
 
        cursor = gol.get_value('cursor')
        cursor.execute(sql)
        result = cursor.fetchall()
 
    show_select_vaccine_result(result)
三、数据库数据字典
1、接种人员(person)

字段名	字段标题	字段类型	默认	字段备注
id	ID	int	无	ID
name	姓名	varchar(32)	无	姓名
cert_no	身份证号	varchar(32)	无	身份证号
birthday	生日	datetime	无	生日
gender	性别	vtinyint(1)	无	性别
address	家庭住址	varchar(128)	无	家庭住址
phone	电话	varchar(16)	无	电话
adverse_effect	不良反应	varchar(64)	无	不良反应


2、生产厂家(manufacturer)



字段名	字段标题	字段类型	默认	字段备注
id	ID	int	无	ID
name	厂家名称	varchar(255)	无	厂家名称
company_no	厂家编号	varchar(32)	无	厂家编号
address	厂家地址	varchar(255)	无	厂家地址
contact_person	联系人	varchar(255)	无	联系人
contact_phone	联系人电话	int	无	联系人电话


3、疫苗信息(vaccine)



字段名	字段标题	字段类型	默认	字段备注
id	ID	int	无	ID
name	疫苗名称	varchar(64)	无	ID
vaccine_no	疫苗编号	varchar(64)	无	疫苗名称
vaccine_type	疫苗品种	datetime(32)	无	疫苗品种
company_no	疫苗厂家编号	vtinyint(32)	无	疫苗厂家编号
production_at	生产日期	datetime	无	生产日期
expired_at	过期时间	datetime	无	过期时间


4、接种信息(inject_info)



字段名	字段标题	字段类型	默认	字段备注
id	ID	int	无	ID
inject_no	接种编号	varchar(32)	无	接种编号
vaccine_no	接种疫苗编号	varchar(32)	无	接种疫苗编号
vaccine_type	疫苗品种	varchar(32)	无	疫苗品种
inject_does	接种剂次	varchar(16)	无	接种剂次
person_name	接种人姓名	varchar(32)	无	接种人姓名
person_cert_no	接种人身份证号	varchar(32)	无	接种人身份证号
inject_at	接种时间	datetime	无	接种时间
inject_company	接种单位	varchar(128)	无	接种单位

运行效果

1、设计背景

在这里插入图片描述

2、小组信息

在这里插入图片描述

3、主界面

在这里插入图片描述

4、新增操作

在这里插入图片描述
结果:可见新加的“张三”信息已成功插入。
在这里插入图片描述

5、删除操作

在这里插入图片描述
结果:可见新加的“张三”信息已成功删除。

6、查询操作

在这里插入图片描述

7、修改操作

在这里插入图片描述
结果:邓阳华的家庭住址已经被修改。
在这里插入图片描述
好了小伙伴们,今天的分享就到这!下次再见!

零基础Python学习资源介绍

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈


资料领取

上述这份完整版的Python全套学习资料已经上传优快云官方,朋友们如果需要可以微信扫描下方优快云官方认证二维码输入“领取资料” 即可领取

在这里插入图片描述

好文推荐

了解python的前景:https://blog.youkuaiyun.com/weixin_49895216/article/details/127186741

了解python能做什么:https://blog.youkuaiyun.com/weixin_49895216/article/details/127124870

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值