Pandas DataFrame에서 DB에 INSERT, datetime 데이터 관련 에러

rowingRoot·2022년 8월 24일
0

troubleshooting

목록 보기
4/4
post-thumbnail

*데이터는 df 라는 pandas DataFrame에 담겨있고, 사용하는 테이블은 test 라고 가정

크기가 큰 데이터는 execute보다 executemany로 처리하는게 훨씬 속도가 빠름
그렇기때문에 executemany 사용하기 위해서 데이터를 튜플이 담긴 리스트 형태로 변환해줌

df_tupleList = list(tuple(df.itertuples(index=False,name=None)))

insert 할때 column 명을 일일이 명시하는것도 가능은 하지만 column 갯수가 많은 경우 번거로워지기 때문에 데이터의 컬럼 갯수만큼 순서대로 table에 들어가는 형태로 쿼리 작성
(데이터와 테이블의 컬럼 갯수가 일치해야함)

bind_names = ",".join(":" + str(i + 1)\
for i in range(df.columns.__len__()))
sql_load = "insert into test values (" + bind_names + ")"

이렇게 하면 bind names는 (:1,:2,:3...,:n) 형태로 만들어져 컬럼의 순서대로 들어가게 됨
executemany에 sql문과 튜플 리스트를 인자로 넘겨주어 실행

cursor.executemany(sql_load,df_tupleList) 
connection.commit()
connection.close()

이렇게 insert 할때 테이블에 timestamp 타입의 컬럼이 있으면 형식을 맞춰줘도 에러가 나는 경우가 있는데(이 글을 작성한 이유)

ORA-01843: not a valid month
해당 에러는 테이블에 부적합한 데이터 타입을 삽입하려 해서 발생하는 에러로 보인다. 이런 에러가 발생하는 경우 strftime이 아닌 strptime을 통해 데이터 타입을 datetime.datetime으로 바꿔줘야한다.(strftime은 문자열 타입을 반환한다.)

추가적으로 데이터프레임을 튜플-리스트 형태로 만들어주는 방법 중 pandas 메소드인 df.to_records()를 통해 튜플 형태로 만들어주는 방법도 있긴 있는데 해당 방법을 이용하면 datetime 형태의 데이터가 numpy.datetime64로 변해버려 insert 할 때 에러가 발생하기 때문에 to_record 보다는 itertuples 방법을 사용하는게 수월할 것 같다.

0개의 댓글