데이터 분석/SQL

python json int형 datetime으로 바꾸고 mysql에 insert하기

catloaf 2021. 11. 12. 15:45

excel 엑셀 파일을 json으로 바꾼 뒤

한줄씩 불러들여 sql에 insert하려고 했더니, datetime table에 0000-00-00 00:00:00으로 들어갔다.

 

알고봤더니 쥬피터노트북에서는 cs_start_date 칼럼이 datetime형이었는데 엑셀에서 json 변환할 때

int형으로 바뀌었다. 

 

1627689600000 라는 숫자는 timestamp로 바뀌었기 때문에 안의 날짜도 변형된 것이었다.

# Json 가져오기
with open('37900_customer_service_record.json', encoding='utf-8') as json_file:
    json_data = json.load(json_file)
    # print(json_data)
    # print(len(json_data))

    # fileds : 컬럼명
    # print(json_data[0])#1행
    print(json_data[0]['cs_start_date'], type(json_data[0]['cs_start_date']))

    print(json_data[0])

출력:

1627689600000 <class 'int'>

 

timestamp를 datetime형으로 바꿔주어야 한다.

 

먼저 datetime 라이브러리를 import한다

import datetime

 

json_line을 for문으로 한줄씩 읽어들여서 cs_start_date 칼럼의 값을 변수에 저장 후

datetime.fromtimestamp(cs_start_date / 1000) 으로 datetime형식으로 변환한다.

 

 

# table1 insert
def insertsql_from_json():
    curs = conn.cursor()#안 넣어주면 다른 function과 같이 돌릴 때 pymysql.err.Error: Already closed 발생

    try:
        # Json 가져오기
        with open('37900_customer_service_record.json', encoding='utf-8') as json_file:
            json_data = json.load(json_file)

            # json의 key로 접근
            # #json_line : json 객체를 가지는 Array

            json_line = json_data
            # print(len(json_line))

        for i in json_line:
                # customer_service_record
                id = i['id']
                cs_assignee = 'cs_assignee'
                status = i['status']
                cs_start_date = i['cs_start_date']
                # timestamp->datetime으로 변환하는 법
                md = datetime.fromtimestamp(cs_start_date / 1000)
                print(md)
                car_model_id = i['car_model_id']
                cs_category_id = i['cs_category_id']
                created_at = datetime.today().strftime("%Y/%m/%d %H:%M:%S")
                print(created_at)
                updated_at = datetime.today().strftime("%Y/%m/%d %H:%M:%S")
                contents = i['contents']
                case_id = i['case_id']

                # data insert
                sql_insert = "insert into customer_service_record(id, cs_assignee, status, cs_start_date, car_model_id, cs_category_id,created_at, updated_at, contents, case_id) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                #table 칼럼명과 같아야 함
                try:
                    curs.execute(sql_insert, (id, cs_assignee, status, md, car_model_id, cs_category_id,created_at, updated_at, contents, case_id))
                    rs = conn.commit()  # enter # curs.excute 줄에 맞추면 마지막것만 들어감
                    print('success insert', rs)
                except Exception as e:
                    print('error:', e)


    finally:
        curs.close()#문 제대로닫기

 

그리고 main.py에서 실행하면 제대로 date 값이 datetime 형식으로 들어가는 걸 알 수 있다

 

from db_bmwgs import insertsql_from_json, read

insertsql_from_json()

read()

datagrip에서 table에 값이 잘 들어갔는지 확인

 

반응형