한번에 insert 여러 개 하기
DB에 업로드할 때 보통은 한 줄씩 하는 경우가 많다.
한 줄씩 해도 상관은 없지만 업로드하는 행 수가 100 만행, 1000 만행이 넘어간다면???
처음에 구글링을 통해 알게 된 방법은
values (값 1, 값 2), (값 3, 값 4)
이렇게 values 뒤에 여러개를 붙이면 된다는데 어느 세월에 다 하겠나 싶고..
데이터 분석에 있어서 시간 단축은 떼려야 뗄 수 없는 관계이다.
10분이라도 줄이기 위해 생각한 방법인데 예상보다 업로드 속도가 매우매우 빠르다.
예제 코드
# 빈 리스트 생성
sql_rows = []
# 리스트에 한줄씩 추가
sql_row = '({},{},{},{})'.format(id, name, date, value)
sql_rows.append(sql_row)
# 10000개가 채워졌을 경우 db에 한번에 업로드
if len(sql_rows) >= 10000:
cursor = db.cursor()
sql = "INSERT IGNORE INTO table_name(column_id, column_name, column_date, column_val) VALUES " + ",".join(sql_rows)
cursor.execute(sql)
db.commit()
sql_rows = []
# 나머지행 db에 업로드
if sql_rows:
sql = "INSERT IGNORE INTO table_name(column_id, column_name, column_date, column_val) VALUES " + ",".join(sql_rows)
cur.execute(sql)
db.commit()
append를 이용해 리스트에 담고 join함수로 한 번에 values 뒤에 넣어주는 방법이다.
효과적으로 쓰기 위해선 for문 안에서 append를 통해 값을 추가하고,
원하는 개수가 됐을 때 한번에 insert 하면 된다.
왜냐하면 execute()를 여러번 하지 않고 한 큐에 하는 것이 효율 UP!
**** 여기서 주의할 점 : INSERT하고 나서 리스트를 꼭 비워야 한다. ****
맨 처음 리스트 생성은 꼭 for문 밖에서 선언해주기!
앞에 db 연동 과정, 중간중간에 전처리 과정은 다 생략했다.
위에 네 덩이를 적절한 곳에 잘 배치하여 실행시킨다면 유용하게 쓸 수 있을 것@@!!@@
반응형