데이터 분석/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에 값이 잘 들어갔는지 확인

반응형