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ù)查詢,數(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)廠家(manufacturer)》、《疫苗信息(vaccine)》、《接種信息(inject_info)》。
- 《接種人員》表的數(shù)據(jù)項(xiàng):姓名,身份證號(hào),生日,性別,家庭住址,聯(lián)系電話,不良反應(yīng)。
- 《生產(chǎn)廠家》表的數(shù)據(jù)項(xiàng):廠家名稱(chēng),廠家編號(hào),廠家地址,聯(lián)系人,聯(lián)系人電話。
- 《疫苗信息》表的數(shù)據(jù)項(xiàng):疫苗名稱(chēng),疫苗編號(hào),疫苗品種,疫苗廠家編號(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:
# 更新電話
new_phone = input("請(qǐng)輸入修改后的接種人聯(lián)系電話:")
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()
# 獲取用戶輸入
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()
# 獲取用戶輸入
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í)行查詢
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)
# 廠家編號(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 | 電話 | varchar(16) | 無(wú) | 電話 |
| adverse_effect | 不良反應(yīng) | varchar(64) | 無(wú) | 不良反應(yīng) |
2、生產(chǎn)廠家(manufacturer)
| 字段名 | 字段標(biāo)題 | 字段類(lèi)型 | 默認(rèn) | 字段備注 |
|---|---|---|---|---|
| id | ID | int | 無(wú) | ID |
| name | 廠家名稱(chēng) | varchar(255) | 無(wú) | 廠家名稱(chēng) |
| company_no | 廠家編號(hào) | varchar(32) | 無(wú) | 廠家編號(hào) |
| address | 廠家地址 | varchar(255) | 無(wú) | 廠家地址 |
| contact_person | 聯(lián)系人 | varchar(255) | 無(wú) | 聯(lián)系人 |
| contact_phone | 聯(lián)系人電話 | int | 無(wú) | 聯(lián)系人電話 |
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 | 疫苗廠家編號(hào) | vtinyint(32) | 無(wú) | 疫苗廠家編號(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、查詢操作

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-02
Python對(duì)字符串實(shí)現(xiàn)去重操作的方法示例
字符串去重是python中字符串操作常見(jiàn)的一個(gè)需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關(guān)于Python對(duì)字符串實(shí)現(xiàn)去重操作的相關(guān)資料,文中給出了詳細(xì)的介紹,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08
windows下添加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-05
python使用mysql數(shù)據(jù)庫(kù)示例代碼
本篇文章主要介紹了python使用mysql數(shù)據(jù)庫(kù)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
python代碼打印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-06
python練習(xí)之循環(huán)控制語(yǔ)句 break 與 continue
這篇文章主要介紹了python循環(huán)控制語(yǔ)句 break 與 continue,break就像是終止按鍵,不管執(zhí)行到哪一步,只要遇到break,不管什么后續(xù)步驟,直接跳出當(dāng)前循環(huán)2022-06-06

