[2021.08.11] How to insert json data requested by Postman into AWS DB in real time Using Python?
공기질 프로젝트를 위한 b실시간으로 Postman 에서 json data를 가져온 후 AWS DB에 넣는 방법에 대해 알아보자.
개발 환경 : Jupyter Notebook (Python)
* 2021-08-15 최종으로 완성
-> postman에 fromdate,todate 실시간으로 시간을 받아와 넣어서 데이터를 추출 하려고 하였으나, 약간의 딜레이로 데이터가 계속적으로 추출되지 않아, fromdate에는 현재시간 -10분 , todate 에는 현재시간 +45분, 즉 55분의 범위로 값을 추출하니 정상적으로 작동함. (최종완성)
--------------------------------------------------------------------------------------------------------------------------
간단한 코드 흐름 (로직)
for loop {
처음에는 우선, fromdata 에 temp_time을 넣는다
* temp_time : 현재시간에서 임시로 -5분이라고 가정
그런 다음에, toData에는 current_time (현재 시간을 가져옴 e.g : 20210811191530)
그러고 나서 for loop 제일 마지막에 추가한다.
temp_time = current_time
fromdata = temp_time
toData = current_time에 +5분 해주는 이런식으로, 계속 시간을 실시간으로 업데이트 해주면서, 계속 데이터를 넣게끔 하는 것이다.
}
-> 이렇게 똑같이는 구현하지 않음.
-> 아래 코드(Full code)가 훨씬 더 정확함. 아래꺼를 보는 것을 권장함.(간단하게 코드 흐름을 이해 시켜주기 위해 적음)
--------------------------------------------------------------------------------------------------------------------------
일단 해당 코드를 구현하기 위해선 알아야 할 것이 있다
1. AWS DB 연동 방법 (+ 원격 접속 권한을 위한, 계정 생성 및 권한 부여)
2. 현재시간을 추출 하는 방법(Python - datetime 모듈 이용)
-> postman에서 fromdata, todata 형식이 20210811185130이런 형태기 때문에 맞춰줘야함
-> 그럴려면, 분, 초에 대해 조건을 줘서 추가 해줘야 함(약간의 알고리즘?)
3. Python Code 로 AWS DB에 데이터를 넣는 방법
-> mycursor.execute()
4. ★★★★★ 자바에는 map(Hash table, Hash map)이 있지만, 파이썬은 dict(사전)이 있음 ★★★★★
- 자바와 파이썬 둘다 key-value 형태임
- Hashmap은 유니크한 값을 나타남. (파이썬 dict도 동일)
* my_dict[serial_arrlist[i]] = now_time() # ★★★★★ dict 함수에 동시에 key & value 넣음 ★★★★★
* fromDate = my_dict[serial_arrlist[i]] # dict 시리얼 넘버(key)에 저장된 현재시간(value)을 저장함
e.g : 20210811160000
* my_dict[serial_arrlist[i]] = toDate
★ 작업이 끝난 후, 각 시리얼 넘버에 toDate를 넣어줌, 그래야 시간이 계속 갱신되면서, 데이터가 실시간으로 들어감 ★
★★★4번 dict를 하면서 느낀점 ★★★
-> dict는 파이썬의 유일한 Hash table, Hash map 이다(사진을 보자). 꼭 사용 방법에 대해 숙지 해두자.
<for loop를 처음 시작 했을 때, 시리얼 넘버의 시간 출력 결과>
<for loop가 한번 끝난 후, 같은 시리얼 넘버의 시간이 실시간으로 최신화>
-> 시리얼 넘버: 24:0A:C4:22:37:72가 첫 번째 for loop에서 시간은 20210811164841 이였지만, 두 번째 for loop에서는 시간이 20210811164905로 최신화 된 것을 확인할 수 있다. 이것이 바로, dict. Hash table 기능이다.
---------------------------------------------------------------------------------------------------------------------------------
<Full Code>
import json
import requests
import datetime # 현재 시간을 가져오기 위한 모듈
import time
import pymysql
serial_arrlist = [
"24:0A:C4:22:40:7E",
"24:6F:28:3C:77:46",
"24:0A:C4:22:34:FA",
"24:0A:C4:22:37:72", # unv_0001
"24:0A:C4:22:41:B6",
"24:0A:C4:22:37:D2",
"24:0A:C4:22:41:C2",
"24:0A:C4:22:34:2E",
"24:0A:C4:22:39:12",
"24:0A:C4:22:37:9E",
"24:0A:C4:22:38:EA",
"24:0A:C4:22:41:6A",
"24:0A:C4:22:3E:9A",
"24:0A:C4:22:34:B2",
"24:6F:28:3C:7A:22",
"24:0A:C4:22:43:1A",
"24:0A:C4:22:3A:AE",
"24:0A:C4:22:35:B6",
"24:0A:C4:22:44:3E",
"24:0A:C4:22:36:66",
"24:0A:C4:22:34:0A",
"24:0A:C4:22:34:8E",
"24:0A:C4:22:3D:0A",
"24:0A:C4:22:42:4A",
"24:6F:28:3C:7D:7A", # org_0001
"24:0A:C4:22:34:FA", # COM_0001
"24:6F:28:3C:77:46", # COM_0001
]
# Azure or AWS DB 연동
def get_db():
db = pymysql.connect(
host='mysql.monorama.kr',
port=3306,
user='admin',
passwd='1/zw;GytAwx*',
db='AIR',
charset='utf8'
)
return db
# todate를 위한 함수.(현재시간에서 10분 추가)
def ten_minute_add():
now_time = datetime.datetime.now()
now_plus_10 = now_time + datetime.timedelta(minutes = 10)
now_plus_10 = now_plus_10.strftime('%Y%m%d%H%M%S')
#print(now_plus_10)
return now_plus_10
# fromdate를 위한 함수 (현재시간에서 10분 감소)
def ten_minute_minus():
now_time = datetime.datetime.now()
now_minus_10 = now_time - datetime.timedelta(minutes = 45)
now_minus_10 = now_minus_10.strftime('%Y%m%d%H%M%S')
#print(now_minus_10)
return now_minus_10
# org json 데이터
my_dict = {} # ★★★ java에서는 map (Hash table, Hash map) , Python 에서는 dict(사전) 사용, 같은기능임 ★★★
def sc_org_json_data():
db = get_db()
mycursor = db.cursor()
# -------------------postman query data -----------------------------
url = "https://us-central1-mytypescript-62c14.cloudfunctions.net/getData"
try :
for i in range(0,len(serial_arrlist)):
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분----------------------
my_dict[serial_arrlist[i]] = ten_minute_minus() # ★★★★★ dict 함수에 동시에 key & value 넣음 ★★★★★
print("현재 작업중인 시리얼 넘버:", serial_arrlist[i])
fromDate = my_dict[serial_arrlist[i]] # dict 시리얼 넘버(key)에 저장된 현재시간(value) - 0분을 저장. 111번 라인
toDate = ten_minute_add() # ten_minute_add()을 사용해서, currnet_time (현재시간) 에서 10분을 추가해서 저장
print("fromDate: ",fromDate) # 20210815210000
print("toDate: ",toDate) # 20210815211000
# --------------------------------POSTMAN 그대로 가져옴-----------------------------
payload = json.dumps({
"fromDate": fromDate, # 이전에 수행되었던 시간
"toDate": toDate, # 현재시간(20210811154000) - 이전에 수행되엇던 시간(20210811153500) = 이번차례에 수행되는 시간
"siteCode": "com_0001",
"key": "Qkslffk@91",
"serialNum" : serial_arrlist[i],
"format": "json",
"segment": "avg"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
data = response.json()
print(data) # {'message': 'Not Found', 'content': 'Plz, check condition'}
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분 2 ----------------------
my_dict[serial_arrlist[i]] = toDate # ★★★★★ 작업이 끝난 후, 각 시리얼 넘버에 toDate를 넣어줌, 그래야 시간이 지난 것에 대해 데이터가 들어감 ★★★★★
#print(my_dict)
try :
for i in data:
# data 값이 비어 있으면, message, content 라는 str 값이 data에 존재함.
# 그렇기 때문에, 에러메세지(string indices must be integers)가 발생함
# 데이터가 제대로 들어오면 에러가 발생하지 않음
#print(i) # 위에 주석으로 적어 놓았음
mycursor.execute("insert into hanbang_air_data(SerialNum,Co2,Humid,Pm10,Pm5,Temp,Vocs,timeZone,ReportTime,Lat,Lng) values (%s ,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(i["serialNum"],i["co2"],i["humid"],i["pm10"],i["pm5"],i["temp"],i["vocs"],i["timeZone"],i["reportTime"],i["lat"],i["long"]))
db.commit()
db.close()
print("=======성공적으로 json data 삽입을 완료하였습니다.=====")
print("\n\n\n")
except Exception as e:
print("DB에 JSON 데이터 삽입 실패:",e)
print("\n\n\n")
except :
pass
# unv json 데이터
my_dict2 = {} # ★★★ java에서는 map (Hash table, Hash map) , Python 에서는 dict(사전) 사용, 같은기능임 ★★★
def sc_unv_json_data():
db = get_db()
mycursor = db.cursor()
# -------------------postman query data -----------------------------
url = "https://us-central1-mytypescript-62c14.cloudfunctions.net/getData"
try :
for i in range(0,len(serial_arrlist)):
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분----------------------
my_dict2[serial_arrlist[i]] = ten_minute_minus() # ★★★★★ dict 함수에 동시에 key & value 넣음 ★★★★★
print("현재 작업중인 시리얼 넘버:", serial_arrlist[i])
fromDate = my_dict2[serial_arrlist[i]] # dict 시리얼 넘버(key)에 저장된 현재시간(value) -10분을 저장. 111번 라인
toDate = ten_minute_add() # ten_minute_add()을 사용해서, currnet_time (현재시간) 에서 10분을 추가해서 저장
print("fromDate: ",fromDate) # 20210815210000
print("toDate: ",toDate) # 20210815211000
# --------------------------------POSTMAN 그대로 가져옴-----------------------------
payload = json.dumps({
"fromDate": fromDate, # 이전에 수행되었던 시간
"toDate": toDate, # 현재시간(20210811154000) - 이전에 수행되엇던 시간(20210811153500) = 이번차례에 수행되는 시간
"siteCode": "unv_0001",
"key": "Qkslffk@91",
"serialNum" : serial_arrlist[i],
"format": "json",
"segment": "avg"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
data = response.json()
print(data) # {'message': 'Not Found', 'content': 'Plz, check condition'}
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분 2 ----------------------
my_dict2[serial_arrlist[i]] = toDate # ★★★★★ 작업이 끝난 후, 각 시리얼 넘버에 toDate를 넣어줌, 그래야 시간이 지난 것에 대해 데이터가 들어감 ★★★★★
#print(my_dict)
try :
for i in data:
# data 값이 비어 있으면, message, content 라는 str 값이 data에 존재함.
# 그렇기 때문에, 에러메세지(string indices must be integers)가 발생함
# 데이터가 제대로 들어오면 에러가 발생하지 않음
#print(i) # 위에 주석으로 적어 놓았음
mycursor.execute("insert into hanbang_air_data(SerialNum,Co2,Humid,Pm10,Pm5,Temp,Vocs,timeZone,ReportTime,Lat,Lng) values (%s ,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(i["serialNum"],i["co2"],i["humid"],i["pm10"],i["pm5"],i["temp"],i["vocs"],i["timeZone"],i["reportTime"],i["lat"],i["long"]))
db.commit()
db.close()
print("=======성공적으로 json data 삽입을 완료하였습니다.=====")
print("\n\n\n")
except Exception as e:
print("DB에 JSON 데이터 삽입 실패:",e)
print("\n\n\n")
except :
pass
# com json 데이터
my_dict3 = {} # ★★★ java에서는 map (Hash table, Hash map) , Python 에서는 dict(사전) 사용, 같은기능임 ★★★
def sc_com_json_data():
db = get_db()
mycursor = db.cursor()
# -------------------postman query data -----------------------------
url = "https://us-central1-mytypescript-62c14.cloudfunctions.net/getData"
try :
for i in range(0,len(serial_arrlist)):
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분----------------------
my_dict3[serial_arrlist[i]] = ten_minute_minus() # ★★★★★ dict 함수에 동시에 key & value 넣음 ★★★★★
print("현재 작업중인 시리얼 넘버:", serial_arrlist[i])
fromDate = my_dict3[serial_arrlist[i]] # dict 시리얼 넘버(key)에 저장된 현재시간(value) - 10분을 저장. 111번 라인
toDate = ten_minute_add() # ten_minute_add()을 사용해서, currnet_time (현재시간) 에서 10분을 추가해서 저장
print("fromDate: ",fromDate) # 20210815210000
print("toDate: ",toDate) # 20210815211000
# --------------------------------POSTMAN 그대로 가져옴-----------------------------
payload = json.dumps({
"fromDate": fromDate, # 이전에 수행되었던 시간
"toDate": toDate, # 현재시간(20210811154000) - 이전에 수행되엇던 시간(20210811153500) = 이번차례에 수행되는 시간
"siteCode": "com_0001",
"key": "Qkslffk@91",
"serialNum" : serial_arrlist[i],
"format": "json",
"segment": "avg"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
data = response.json()
print(data) # {'message': 'Not Found', 'content': 'Plz, check condition'}
# ------------------ 계속 돌리기 위해 추가 및 수정한 부분 2 ----------------------
my_dict3[serial_arrlist[i]] = toDate # ★★★★★ 작업이 끝난 후, 각 시리얼 넘버에 toDate를 넣어줌, 그래야 시간이 지난 것에 대해 데이터가 들어감 ★★★★★
#print(my_dict)
try :
for i in data:
# data 값이 비어 있으면, message, content 라는 str 값이 data에 존재함.
# 그렇기 때문에, 에러메세지(string indices must be integers)가 발생함
# 데이터가 제대로 들어오면 에러가 발생하지 않음
#print(i) # 위에 주석으로 적어 놓았음
mycursor.execute("insert into hanbang_air_data(SerialNum,Co2,Humid,Pm10,Pm5,Temp,Vocs,timeZone,ReportTime,Lat,Lng) values (%s ,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(i["serialNum"],i["co2"],i["humid"],i["pm10"],i["pm5"],i["temp"],i["vocs"],i["timeZone"],i["reportTime"],i["lat"],i["long"]))
db.commit()
db.close()
print("=======성공적으로 json data 삽입을 완료하였습니다.=====")
print("\n\n\n")
except Exception as e:
print("DB에 JSON 데이터 삽입 실패:",e)
print("\n\n\n")
except :
pass
#-------------------------------main----------------------------
while True :
print("=========현재 작업 중인 SiteCode: org_0001 ==========")
sc_org_json_data()
print("============org_0001 작업이 끝났습니다. =============")
time.sleep(10)
print("===============새로운 작업을 시작합니다 ====================")
print("==========현재 작업 중인 SiteCode: unv_0001 ==========")
sc_unv_json_data()
print("============unv_0001 작업이 끝났습니다. =============")
time.sleep(10)
print("===============새로운 작업 시작============")
print("=========현재 작업 중인 SiteCode: COM_0001 =========")
sc_com_json_data()
print("===========COM_0001 작업 종료=============")
time.sleep(10)
print("========= org,unv,com 작업 1 cycle success!! ==========")
print("\n\n\n")
# In[ ]:
<출력 결과>
* 꼭 시간에 10초미만,10분미만,10시 미만일 경우 조건을 통해 0을 붙여줘야함.
댓글