Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解
引言
那一年過(guò)年前,疫情開(kāi)始爆發(fā),對(duì)全國(guó)人民的生活和工作造成了嚴(yán)重的影響。但憑借著國(guó)家強(qiáng)盛的實(shí)力,新冠疫苗也很快的被技術(shù)人員研發(fā)出來(lái),人們通過(guò)接種新冠疫苗來(lái)抵御新冠病毒的危害。本次通過(guò)接種新冠疫苗的這個(gè)數(shù)據(jù)統(tǒng)計(jì),來(lái)設(shè)計(jì)“疫苗接種數(shù)據(jù)庫(kù)”,存儲(chǔ)人們接種疫苗的相關(guān)信息,并實(shí)現(xiàn)“增刪改查”等基本操作以及其他的拓展功能。
國(guó)內(nèi)新冠疫苗人員接種后,如果不通過(guò)數(shù)據(jù)統(tǒng)計(jì)到數(shù)據(jù)庫(kù),數(shù)據(jù)量之大,數(shù)據(jù)查詢(xún),數(shù)據(jù)核實(shí),數(shù)據(jù)更改等工作會(huì)非常不方便,通過(guò)編程語(yǔ)言,設(shè)計(jì)疫苗接種數(shù)據(jù)庫(kù),來(lái)存儲(chǔ)接種疫苗相關(guān)數(shù)據(jù),能使得工作人員和接種人員的工作量大大減少,從而減少工作負(fù)擔(dān),節(jié)省時(shí)間,減少更多的財(cái)力損失,實(shí)現(xiàn)更好的數(shù)據(jù)管理,是一種非常高效、精確、快捷、方便的方式。
一、數(shù)據(jù)庫(kù)信息
本次數(shù)據(jù)庫(kù)設(shè)計(jì)一共四張表,分別為《接種人員(person)》、《生產(chǎn)廠(chǎng)家(manufacturer)》、《疫苗信息(vaccine)》、《接種信息(inject_info)》。
- 《接種人員》表的數(shù)據(jù)項(xiàng):姓名,身份證號(hào),生日,性別,家庭住址,聯(lián)系電話(huà),不良反應(yīng)。
- 《生產(chǎn)廠(chǎng)家》表的數(shù)據(jù)項(xiàng):廠(chǎng)家名稱(chēng),廠(chǎng)家編號(hào),廠(chǎng)家地址,聯(lián)系人,聯(lián)系人電話(huà)。
- 《疫苗信息》表的數(shù)據(jù)項(xiàng):疫苗名稱(chēng),疫苗編號(hào),疫苗品種,疫苗廠(chǎng)家編號(hào),生產(chǎn)日期,過(guò)期時(shí)間。
- 《接種信息》表的數(shù)據(jù)項(xiàng):接種編號(hào),接種疫苗編號(hào),疫苗品種,接種劑次,接種人姓名,接種人身份證號(hào),接種時(shí)間,接種單位。
主要階段
- 確定選題:《課程設(shè)計(jì)-疫苗接種數(shù)據(jù)庫(kù)》。
- 需求分析:《數(shù)據(jù)庫(kù)數(shù)據(jù)字典》,編程語(yǔ)言為:python + mysql
二、關(guān)鍵代碼展示
1、app.py(主函數(shù))
if __name__ == '__main__': # 全局變量初始化 gol._init() # # 課題背景信息 # menu.course_background() # # # 打印小組成員信息 # menu.team_info() # 連接數(shù)據(jù)庫(kù)信息 db.connect_to_db(config.db_host, config.db_user, config.db_password, config.db_name) # 跳出數(shù)據(jù)庫(kù)的標(biāo)志 flag = True while (flag): menu.main_menu() cin = input("請(qǐng)輸入要執(zhí)行操作:") choice = int(cin) if cin.isdigit() else config.DEFAULT_INPUT if choice == 0: print("您已選擇退出,感謝您的操作體驗(yàn)") 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("操作選項(xiàng)輸入錯(cuò)誤,請(qǐng)重新輸入") 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 # 根據(jù)身份證號(hào)更新 cert_no = input("請(qǐng)輸入身份證號(hào):") table = config.table_dict[config.TYPE_1] table_inject_info = config.table_dict[config.TYPE_2] if cin_update == 1: # 更新姓名 new_name = input("請(qǐng)輸入修改后的姓名:") 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: # 更新電話(huà) new_phone = input("請(qǐng)輸入修改后的接種人聯(lián)系電話(huà):") 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("請(qǐng)輸入修改后的家庭住址:") 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() # 獲取用戶(hù)輸入 cin = util.get_user_input(5) if cin == 0: return # 獲取數(shù)據(jù)表列 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] # 列類(lèi)型 col_index_type = i[4] # 列索引類(lèi)型 col_desc = i[8] # 列值 # 如果是不需要錄入則跳過(guò), 比如 id,person_id 等 if(col_name in config.SKIP_FIELD_SET): continue util.print_log("當(dāng)前列信息", i) # 輸入值 if col_type == config.FIELD_TYPE_DATETIME: # 日期檢查 a = input("請(qǐng)輸入【%s】, 例如 2022-05-02 : " % col_desc) input_data_invalid = True while(input_data_invalid): if(util.is_valid_date(a) == True): break a = input("您輸入日期不合法,請(qǐng)重新輸入,例如 2022-05-02 : ") else: a = input("請(qǐng)輸入【%s】: " % col_desc) # 判斷唯一關(guān)鍵字是否重復(fù) 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 # 如果重復(fù)則重新輸入 a = input("您輸入與表中信息重復(fù),請(qǐng)重新輸入【%s】" % col_name) field_list.append(col_name) data_list.append(a) # 輸入完成,組裝數(shù)據(jù) field_str = ",".join(field_list) data_tuple = tuple(data_list) # 拼接數(shù)據(jù) sql = ''' INSERT INTO %s(%s) VALUES %s; ''' % (table, field_str, data_tuple) util.print_log(sql) cursor = gol.get_value('cursor') cursor.execute(sql) # 提交數(shù)據(jù) conn = gol.get_value('conn') conn.commit() util.print_log("%s 表成功插入數(shù)據(jù) %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() # 獲取用戶(hù)輸入 cin = util.get_user_input(2) if cin == 0: return delete_value = input("請(qǐng)輸入具體信息:") # 獲取相關(guān)表 table = config.table_dict[config.TYPE_3] table2 = config.table_dict[config.TYPE_2] # 接種編號(hào) 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(): # 執(zhí)行查詢(xún) menu.select_menu_total() # 獲取輸入 cin = util.get_user_input(5) if cin == 0: return if cin == config.TYPE_1: # ------------------查找接種人員相關(guān)信息---------------- 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: # ------------------查找生產(chǎn)企業(yè)相關(guān)信息----------------------- do_select_manufacturer() def do_select_vaccine(): # 查找疫苗信息 menu.select_menu_3() cin = util.get_user_input(5) if cin == 0: return # 獲取搜索數(shù)據(jù) cin2 = input("請(qǐng)輸入搜索數(shù)據(jù):") table = config.table_dict[config.TYPE_3] query_value = cin2 # 結(jié)果集合 result = [] # 疫苗編號(hào) if cin == 1: result = db.query_by_table_field(table, 'vaccine_no', query_value) # 廠(chǎng)家編號(hào) if cin == 2: result = db.query_by_table_field(table, 'company_no', query_value) # 生產(chǎn)日期 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() # 過(guò)期時(shí)間 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)
三、數(shù)據(jù)庫(kù)數(shù)據(jù)字典
1、接種人員(person)
字段名 | 字段標(biāo)題 | 字段類(lèi)型 | 默認(rèn) | 字段備注 |
---|---|---|---|---|
id | ID | int | 無(wú) | ID |
name | 姓名 | varchar(32) | 無(wú) | 姓名 |
cert_no | 身份證號(hào) | varchar(32) | 無(wú) | 身份證號(hào) |
birthday | 生日 | datetime | 無(wú) | 生日 |
gender | 性別 | vtinyint(1) | 無(wú) | 性別 |
address | 家庭住址 | varchar(128) | 無(wú) | 家庭住址 |
phone | 電話(huà) | varchar(16) | 無(wú) | 電話(huà) |
adverse_effect | 不良反應(yīng) | varchar(64) | 無(wú) | 不良反應(yīng) |
2、生產(chǎn)廠(chǎng)家(manufacturer)
字段名 | 字段標(biāo)題 | 字段類(lèi)型 | 默認(rèn) | 字段備注 |
---|---|---|---|---|
id | ID | int | 無(wú) | ID |
name | 廠(chǎng)家名稱(chēng) | varchar(255) | 無(wú) | 廠(chǎng)家名稱(chēng) |
company_no | 廠(chǎng)家編號(hào) | varchar(32) | 無(wú) | 廠(chǎng)家編號(hào) |
address | 廠(chǎng)家地址 | varchar(255) | 無(wú) | 廠(chǎng)家地址 |
contact_person | 聯(lián)系人 | varchar(255) | 無(wú) | 聯(lián)系人 |
contact_phone | 聯(lián)系人電話(huà) | int | 無(wú) | 聯(lián)系人電話(huà) |
3、疫苗信息(vaccine)
字段名 | 字段標(biāo)題 | 字段類(lèi)型 | 默認(rèn) | 字段備注 |
---|---|---|---|---|
id | ID | int | 無(wú) | ID |
name | 疫苗名稱(chēng) | varchar(64) | 無(wú) | ID |
vaccine_no | 疫苗編號(hào) | varchar(64) | 無(wú) | 疫苗名稱(chēng) |
vaccine_type | 疫苗品種 | datetime(32) | 無(wú) | 疫苗品種 |
company_no | 疫苗廠(chǎng)家編號(hào) | vtinyint(32) | 無(wú) | 疫苗廠(chǎng)家編號(hào) |
production_at | 生產(chǎn)日期 | datetime | 無(wú) | 生產(chǎn)日期 |
expired_at | 過(guò)期時(shí)間 | datetime | 無(wú) | 過(guò)期時(shí)間 |
4、接種信息(inject_info)
字段名 | 字段標(biāo)題 | 字段類(lèi)型 | 默認(rèn) | 字段備注 |
---|---|---|---|---|
id | ID | int | 無(wú) | ID |
inject_no | 接種編號(hào) | varchar(32) | 無(wú) | 接種編號(hào) |
vaccine_no | 接種疫苗編號(hào) | varchar(32) | 無(wú) | 接種疫苗編號(hào) |
vaccine_type | 疫苗品種 | varchar(32) | 無(wú) | 疫苗品種 |
inject_does | 接種劑次 | varchar(16) | 無(wú) | 接種劑次 |
person_name | 接種人姓名 | varchar(32) | 無(wú) | 接種人姓名 |
person_cert_no | 接種人身份證號(hào) | varchar(32) | 無(wú) | 接種人身份證號(hào) |
inject_at | 接種時(shí)間 | datetime | 無(wú) | 接種時(shí)間 |
inject_company | 接種單位 | varchar(128) | 無(wú) | 接種單位 |
四、運(yùn)行效果
1、設(shè)計(jì)背景
2、小組信息
3、主界面
4、新增操作
結(jié)果:可見(jiàn)新加的“張三”信息已成功插入。
5、刪除操作
結(jié)果:可見(jiàn)新加的“張三”信息已成功刪除。
6、查詢(xún)操作
7、修改操作
結(jié)果:鄧陽(yáng)華的家庭住址已經(jīng)被修改。
以上就是Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解的詳細(xì)內(nèi)容,更多關(guān)于Python疫苗接種管理數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python猜解網(wǎng)站數(shù)據(jù)庫(kù)管理員密碼的腳本
- Python的Flask框架中使用Flask-SQLAlchemy管理數(shù)據(jù)庫(kù)的教程
- Python使用sqlite3第三方庫(kù)讀寫(xiě)SQLite數(shù)據(jù)庫(kù)的方法步驟
- Python寫(xiě)入MySQL數(shù)據(jù)庫(kù)的三種方式詳解
- Python爬蟲(chóng)獲取數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中的超詳細(xì)教程(一看就會(huì))
- python連接clickhouse數(shù)據(jù)庫(kù)的兩種方式小結(jié)
相關(guān)文章
tensorflow 實(shí)現(xiàn)從checkpoint中獲取graph信息
今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)從checkpoint中獲取graph信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python對(duì)字符串實(shí)現(xiàn)去重操作的方法示例
字符串去重是python中字符串操作常見(jiàn)的一個(gè)需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關(guān)于Python對(duì)字符串實(shí)現(xiàn)去重操作的相關(guān)資料,文中給出了詳細(xì)的介紹,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08windows下添加Python環(huán)境變量的方法匯總
默認(rèn)情況下,在windows下安裝python之后,系統(tǒng)并不會(huì)自動(dòng)添加相應(yīng)的環(huán)境變量。此時(shí)不能在命令行直接使用python命令。今天我們就來(lái)看下,如何簡(jiǎn)單快捷的在windows下添加Python環(huán)境變量2018-05-05python使用mysql數(shù)據(jù)庫(kù)示例代碼
本篇文章主要介紹了python使用mysql數(shù)據(jù)庫(kù)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05python代碼打印100-999之間的回文數(shù)示例
今天小編就為大家分享一篇python代碼打印100-999之間的回文數(shù)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11淺談哪個(gè)Python庫(kù)才最適合做數(shù)據(jù)可視化
數(shù)據(jù)可視化是任何探索性數(shù)據(jù)分析或報(bào)告的關(guān)鍵步驟,目前有許多非常好的商業(yè)智能工具,比如Tableau、googledatastudio和PowerBI等,本文就詳細(xì)的進(jìn)行對(duì)比,感興趣的可以了解一下2021-06-06python練習(xí)之循環(huán)控制語(yǔ)句 break 與 continue
這篇文章主要介紹了python循環(huán)控制語(yǔ)句 break 與 continue,break就像是終止按鍵,不管執(zhí)行到哪一步,只要遇到break,不管什么后續(xù)步驟,直接跳出當(dāng)前循環(huán)2022-06-06