본문 바로가기
Cloud/AWS

[2021.08.11] How to insert json data requested by Postman into AWS DB in real time Using Python?

by injekim97 2021. 8. 11.
반응형

[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을 붙여줘야함.

 

최종08152130_json_data_org_unv_com.ipynb
0.05MB
최종08152130_json_data_org_unv_com.py
0.01MB

반응형

댓글