(三)利用sqlite將json數(shù)據(jù)集按照表結(jié)構(gòu)持久化操作

繼上篇(二)利用json將excel內(nèi)容生成json文件)后,我們已經(jīng)實(shí)現(xiàn)了從excel中讀取內(nèi)容生成json文件丧靡,如果讀出的data數(shù)組有中文,需要特別注意encoding的問題籽暇,并且通過json.dump()生成的json是標(biāo)準(zhǔn)的帶雙引號(hào)的json格式温治,這對(duì)后面解析json也提供了方便。在實(shí)際工作中戒悠,往往也會(huì)有很多場(chǎng)景是接收一些json再在數(shù)據(jù)庫(kù)中進(jìn)行持久化的熬荆,比如在編寫寫網(wǎng)絡(luò)爬蟲應(yīng)用時(shí),就會(huì)用到本章節(jié)所述的知識(shí)點(diǎn)绸狐。

sqlite是一個(gè)短小精干的功能強(qiáng)大的數(shù)據(jù)庫(kù)卤恳,使用python操作sqlite的語(yǔ)法與操作oracle、mysql類似六孵。為實(shí)現(xiàn)疫情數(shù)據(jù)的持久化纬黎,這里采用sqlite進(jìn)行示意。
1劫窒,創(chuàng)建sqlite數(shù)據(jù)庫(kù)文件
python中自帶了sqlite本今,無需做pip install,可直接這樣操作:

import sqlite3
conn = sqlite3.connect("system.db.sqlite")

會(huì)在當(dāng)前py所在的文件夾下創(chuàng)建system.db.sqlite的文件主巍,此文件既是sqlite3數(shù)據(jù)庫(kù)的數(shù)據(jù)文件冠息。
2,創(chuàng)建員工疫情數(shù)據(jù)庫(kù)表
可以在sqlite admin工具創(chuàng)建孕索,也可以用python創(chuàng)建:

# 創(chuàng)建一個(gè)游標(biāo) curson
cursor = conn.cursor()
# 執(zhí)行一條語(yǔ)句,創(chuàng)建 day_temperature 表
sql = "create table day_temperature (id integer PRIMARY KEY autoincrement, input_date date," \
      "dep varchar(60), name varchar(60), is_base varchar(60), city varchar(60), leave_date varchar(60), leave_date_v varchar(60)" \
      ", back_date varchar(60), address varchar(100), out varchar(60), isOK varchar(60), temperature float, flag1 varchar(60)" \
      ", flag2 varchar(60), flag3 varchar(60), flag4 varchar(60), flag4_v varchar(60)" \
      ", v_1 varchar(60), v_2 varchar(60), can_duty varchar(60), can_duty_v varchar(60)" \
      ", v_3 varchar(60))"
cursor.execute(sql)

3逛艰,創(chuàng)建完數(shù)據(jù)庫(kù)表,然后通過read_json.py文件的data_dict()方法解析的json文件:

start = read_json.JSONReader('ALL2.19.json1')
data = start.data_dict()

得到data[]數(shù)據(jù)搞旭,遍歷data[]形成insert的sql:

for user in data:
   dep = user['所在科室']
   name = user['姓 名']
   is_base = user['是否在漢(填寫是或否)']
   city = user['目前所在城市(填寫城市名)']
   leave_date = user['離漢時(shí)間/同行人員(從1月22日0時(shí)后開始填寫散怖,如:1月23日/妻子菇绵、女兒)']
   leave_date_v = user['離漢交通工具及目的地(填寫類別/車次、航班號(hào)镇眷、私家車牌號(hào))']
   back_date = user['預(yù)計(jì)回漢時(shí)間/同行人員/交通工具(如:1月22日/妻子咬最、女兒/飛機(jī))']
   address = user['當(dāng)日所在具體地址(精確到小區(qū)/街道)']
   out = user['當(dāng)日是否外出/外出場(chǎng)所(填寫是或否及詳細(xì)地點(diǎn))']
   isOK = user['是否健康/當(dāng)日體溫(℃)(填寫是或否及當(dāng)日最高體溫)']
   temperature = str(re.findall(r"\d+\.?\d*", isOK)[0])
   flag1 = user['有無接觸確診(疑似)病例史(填寫有或無/接觸人員情況/接觸時(shí)間)']
   flag2 = user['是否普通病例(填寫是或否/癥狀)']
   flag3 = user['是否疑似病例(填寫是或否/癥狀)']
   flag4 = user['是否確診病例(填寫是或否/癥狀)']
   flag4_v = user['確診時(shí)間/機(jī)構(gòu)(填寫確診時(shí)間及診斷機(jī)構(gòu)名稱)']
   v_1 = user['目前采取措施(詳細(xì)填寫采取措施、方法)']
   v_2 = user['備 注(未盡事項(xiàng)欠动,可備注進(jìn)行說明)']
   # can_duty = user['是否能正常到崗']
   # can_duty_v = user['未能正常到崗原因']
   # v_3 = user['到漢后是否需申請(qǐng)集中隔離']
   print(temperature)
   i = i+1
   # 插入一條記錄
   # sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date," \
   #       "address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2," \
   #       "can_duty,can_duty_v,v_3) values (" + "\'"+now_date + "\',\'"+dep + "\',\'" + name + "\',\'" + is_base + "\',\'" + city + "\',\'" + leave_date + "\',\'" + leave_date_v + "\',\'" + back_date + "\',\'" + address + "\',\'" + out + "\',\'" + isOK + "\',\'" + temperature + "\',\'" + flag1 + "\',\'" + flag2 + "\',\'" + flag3 + "\',\'" + flag4 + "\',\'" + flag4_v + "\',\'" + v_1 + "\',\'" + v_2 + "\',\'" + can_duty + "\',\'" + can_duty_v + "\',\'" + v_3 + "\')"
   # print(sql)
   # cursor.execute(sql)

   # 用參數(shù)也可以
   line_paras = [now_date, dep, name, is_base, city, leave_date, leave_date_v, back_date, address, out, isOK,
                 temperature, flag1, flag2, flag3, flag4, flag4_v, v_1, v_2, 'can_duty', 'can_duty_v', 'v_3']
   sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
   cursor.execute(sql,[now_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,'can_duty','can_duty_v','v_3'])

此處永乌,在形成sql時(shí),可以用笨方法具伍,一個(gè)參數(shù)一個(gè)參數(shù)的組裝翅雏,也可以用cursor.execute方法中使用sql的參數(shù)數(shù)組:

sql_paras = []

在for循環(huán)中,形成參數(shù)數(shù)組:

    # 用參數(shù)也可以
    line_paras = [now_date, dep, name, is_base, city, leave_date, leave_date_v, back_date, address, out, isOK,
                  temperature, flag1, flag2, flag3, flag4, flag4_v, v_1, v_2, 'can_duty', 'can_duty_v', 'v_3']
    sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    cursor.execute(sql,[now_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,'can_duty','can_duty_v','v_3'])

針對(duì)大量的insert操作人芽,數(shù)據(jù)庫(kù)會(huì)有吞吐和效率的問題望几,一般可以使用cursor.executemany(sql, sql_paras)方法——注意是在for循環(huán)外執(zhí)行:

sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
cursor.executemany(sql, sql_paras)

4,執(zhí)行完建表和插數(shù)據(jù)后萤厅,記得關(guān)閉游標(biāo)和數(shù)據(jù)庫(kù)橄妆。

# 關(guān)閉游標(biāo):
cursor.close()

# 提交事物
conn.commit()

# 關(guān)閉連接
conn.close()

5,有關(guān)sqlite的基本操作介紹完畢祈坠,下面是sqlite文件夾下data_to_db.py文件的代碼:

import re
import sqlite3
from datetime import datetime

import read_json

conn = sqlite3.connect("system.db.sqlite")

# 創(chuàng)建一個(gè)游標(biāo) curson
cursor = conn.cursor()
# 執(zhí)行一條語(yǔ)句,創(chuàng)建 day_temperature 表
# sql = "create table day_temperature (id integer PRIMARY KEY autoincrement, input_date date," \
#       "dep varchar(60), name varchar(60), is_base varchar(60), city varchar(60), leave_date varchar(60), leave_date_v varchar(60)" \
#       ", back_date varchar(60), address varchar(100), out varchar(60), isOK varchar(60), temperature float, flag1 varchar(60)" \
#       ", flag2 varchar(60), flag3 varchar(60), flag4 varchar(60), flag4_v varchar(60)" \
#       ", v_1 varchar(60), v_2 varchar(60), can_duty varchar(60), can_duty_v varchar(60)" \
#       ", v_3 varchar(60))"
# cursor.execute(sql)

now_date = datetime.now().strftime('%Y-%m-%d')  # 格式為str

start = read_json.JSONReader('ALL2.19.json1')
data = start.data_dict()

sql_paras = []
i = 0
for user in data:
    print(i)
    dep = user['所在科室']
    name = user['姓 名']
    is_base = user['是否在漢(填寫是或否)']
    city = user['目前所在城市(填寫城市名)']
    leave_date = user['離漢時(shí)間/同行人員(從1月22日0時(shí)后開始填寫,如:1月23日/妻子矢劲、女兒)']
    leave_date_v = user['離漢交通工具及目的地(填寫類別/車次赦拘、航班號(hào)、私家車牌號(hào))']
    back_date = user['預(yù)計(jì)回漢時(shí)間/同行人員/交通工具(如:1月22日/妻子芬沉、女兒/飛機(jī))']
    address = user['當(dāng)日所在具體地址(精確到小區(qū)/街道)']
    out = user['當(dāng)日是否外出/外出場(chǎng)所(填寫是或否及詳細(xì)地點(diǎn))']
    isOK = user['是否健康/當(dāng)日體溫(℃)(填寫是或否及當(dāng)日最高體溫)']
    temperature = str(re.findall(r"\d+\.?\d*", isOK)[0])
    flag1 = user['有無接觸確診(疑似)病例史(填寫有或無/接觸人員情況/接觸時(shí)間)']
    flag2 = user['是否普通病例(填寫是或否/癥狀)']
    flag3 = user['是否疑似病例(填寫是或否/癥狀)']
    flag4 = user['是否確診病例(填寫是或否/癥狀)']
    flag4_v = user['確診時(shí)間/機(jī)構(gòu)(填寫確診時(shí)間及診斷機(jī)構(gòu)名稱)']
    v_1 = user['目前采取措施(詳細(xì)填寫采取措施躺同、方法)']
    v_2 = user['備 注(未盡事項(xiàng),可備注進(jìn)行說明)']
    # can_duty = user['是否能正常到崗']
    # can_duty_v = user['未能正常到崗原因']
    # v_3 = user['到漢后是否需申請(qǐng)集中隔離']
    print(temperature)
    i = i+1
    # 插入一條記錄
    # sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date," \
    #       "address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2," \
    #       "can_duty,can_duty_v,v_3) values (" + "\'"+now_date + "\',\'"+dep + "\',\'" + name + "\',\'" + is_base + "\',\'" + city + "\',\'" + leave_date + "\',\'" + leave_date_v + "\',\'" + back_date + "\',\'" + address + "\',\'" + out + "\',\'" + isOK + "\',\'" + temperature + "\',\'" + flag1 + "\',\'" + flag2 + "\',\'" + flag3 + "\',\'" + flag4 + "\',\'" + flag4_v + "\',\'" + v_1 + "\',\'" + v_2 + "\',\'" + can_duty + "\',\'" + can_duty_v + "\',\'" + v_3 + "\')"
    # print(sql)
    # cursor.execute(sql)

    # 用參數(shù)也可以
    line_paras = [now_date, dep, name, is_base, city, leave_date, leave_date_v, back_date, address, out, isOK,
                  temperature, flag1, flag2, flag3, flag4, flag4_v, v_1, v_2, 'can_duty', 'can_duty_v', 'v_3']
    # sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    # cursor.execute(sql,[now_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3])

    # 在該for循環(huán)外使用批量添加丸逸,但要先得到sql的參數(shù)值列表sql_paras
    sql_paras.append(line_paras)

sql = "insert into day_temperature (input_date,dep, name, is_base,city,leave_date,leave_date_v,back_date,address,out,isOK,temperature,flag1,flag2,flag3,flag4,flag4_v,v_1,v_2,can_duty,can_duty_v,v_3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
cursor.executemany(sql, sql_paras)

sql = 'select * from day_temperature'
cursor.execute(sql)

# 關(guān)閉游標(biāo):
cursor.close()

# 提交事物
conn.commit()

# 關(guān)閉連接
conn.close()

補(bǔ)充一下:為了獲取“某個(gè)城市有多少員工”蹋艺,單獨(dú)寫了一個(gè)測(cè)試文件,僅供參考(其實(shí)可以作為一個(gè)工具類的方法)

import sqlite3, json

conn = sqlite3.connect("system.db.sqlite")

def get_citys():
    data = []
    # 創(chuàng)建一個(gè)游標(biāo) curson
    cursor = conn.cursor()

    sql = 'select city,count(*),group_concat(name) from day_temperature group by city'
    cityusers = cursor.execute(sql).fetchall()
    citys = []
    numbers = []
    usernames = []
    for cityuser in cityusers:
        citys.append(cityuser[0])
        numbers.append(cityuser[1])
        usernames.append(cityuser[2])
    data.append(citys)
    data.append(numbers)
    data.append(usernames)

    print(data)
    # 關(guān)閉游標(biāo):
    cursor.close()
    return data

# 提交事物
conn.commit()
get_citys()
# 關(guān)閉連接
conn.close()



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黄刚,一起剝皮案震驚了整個(gè)濱河市捎谨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憔维,老刑警劉巖涛救,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異业扒,居然都是意外死亡检吆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門程储,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹭沛,“玉大人臂寝,你說我怎么就攤上這事√穑” “怎么了咆贬?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)斟或。 經(jīng)常有香客問我素征,道長(zhǎng),這世上最難降的妖魔是什么萝挤? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任御毅,我火速辦了婚禮,結(jié)果婚禮上怜珍,老公的妹妹穿的比我還像新娘端蛆。我一直安慰自己,他們只是感情好酥泛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布今豆。 她就那樣靜靜地躺著,像睡著了一般柔袁。 火紅的嫁衣襯著肌膚如雪呆躲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天捶索,我揣著相機(jī)與錄音插掂,去河邊找鬼。 笑死腥例,一個(gè)胖子當(dāng)著我的面吹牛辅甥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燎竖,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼璃弄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了构回?” 一聲冷哼從身側(cè)響起夏块,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤掸,沒想到半個(gè)月后拨扶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茁肠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年患民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垦梆。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匹颤,死狀恐怖仅孩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情印蓖,我是刑警寧澤辽慕,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站赦肃,受9級(jí)特大地震影響溅蛉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜他宛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一船侧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厅各,春花似錦镜撩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至憔古,卻和暖如春遮怜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿市。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工奈泪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灸芳。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拜姿,于是被迫代替她去往敵國(guó)和親烙样。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容