2014-04-27 4 views
0

psycopg2: insert multiple rows with one query에 따르면 executemany 대신 psycopg2의 execute을 사용하는 것이 훨씬 더 효율적입니다. 다른 사람들도 확인할 수 있습니까?psycopg2를 사용하여 여러 행 삽입

INSERT INTO table VALUES (value1, value2), (value3, value4) 

는 일반 execute 기능을 사용하여 이러한 문을 생성 할 수 있습니다 :

위의 StackOverflow의 질문은 종류의 문장을 만들기위한 mogrify를 사용하여 제안? 나는 형식의 무엇인가를 생각했다.

cursor.execute("""INSERT INTO table VALUES (%s, %s), (%s, %s)""", ((value1,value2),(value3,value4))) 

.

업데이트 : folowing 튜플과

insert into history (timestamp) values (%s),(%s); 

:

예를 들어

, 나는 내가 SQL 문을 실행에 통과 시도

(('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',)) 

을 제외한 모든 난 다시 오류였다있어 :

no results to fetch

+0

처음 시도하지 않으셨습니까? –

+0

다중 값 삽입은 psyopop2의'executemany'보다 훨씬 효율적입니다. 한 문장까지만 수십 개의 행을 삽입하면 메모리 사용이 문제가됩니다. 수백 또는 수천 쌍의 행 (행이 작 으면)은 좋을 수 있습니다. –

답변

4

execute 메소드를 사용하려면 데이터를 목록에 삽입하십시오. 목록이 psycopg2에 의해 배열에 적용됩니다. 그런 다음 배열을 중첩 해제하고 필요에 따라 값을 캐스팅하십시오.

import psycopg2 

insert = """ 
    insert into history ("timestamp") 
    select value 
    from unnest(%s) s(value timestamp) 
    returning * 
;""" 

data = [('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',)] 
conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn") 
cursor = conn.cursor() 
cursor.execute(insert, (data,)) 
print cursor.fetchall() 
conn.commit() 
conn.close() 

executemany와 성능 차이가 큰지 확실하지 않습니다. 그러나 나는 위가 더 깔끔하다고 생각한다. returning 절은 이름에서 알 수 있듯이 삽입 된 튜플을 반환합니다.

BTW timestamp은 예약어이므로 열 이름으로 사용하면 안됩니다.

+0

+1 'unnest'에 대해 그리고 'timestamp'문제, ORM 사용의 잔재를 지적하십시오. – ChaimKut

+0

(포스트 그레스에서는 '타임 스탬프'가 예약되지 않은 것처럼 보입니다.) http://www.postgresql.org/docs/9.3/static/sql-keywords-appendix.html) – ChaimKut