2011-12-29 3 views
27

데이터베이스에서 가져올 행 ID 목록이 있습니다. 나는 파이썬과 psycopg2를 사용하고 있는데, 내 문제는 그 ID를 SQL에 효과적으로 전달하는 방법이다. 나는 그리스트의 길이를 안다면 필요할 때마다 수동으로 또는 자동으로 많은 "% s"표현식을 쿼리 문자열에 추가 할 수 있기 때문에 꽤 쉽다는 것을 알았지 만, 여기에 내가 얼마나 필요한지 모르겠다. . sql "id IN (id1, id2, ...)"문을 사용하여 해당 행을 선택해야합니다. 목록의 길이를 확인하고 "% s"의 적절한 숫자를 쿼리 문자열로 연결하는 것이 가능하다는 것을 알고 있지만 매우 느리고 추한 것 같습니다. 누구든지 그것을 해결하는 방법에 대한 아이디어가 있습니까? 그리고 "IN"선언문을 사용해야하는 이유를 묻지 마십시오. 이것은 클래스 할당의 일부인 벤치 마크입니다. 미리 감사드립니다!psycopg2에서 SQL에 매개 변수 목록 전달

+0

SQL 응답에 반대합니까? 동적 SQL을 사용하면 어떤 길이의 문자열을주고 SQL에서 올바르게 읽을 수 있습니다. – Twelfth

답변

47

파이썬 튜플은 psycopg2에서 SQL 목록에 변환됩니다

cur.mogrify("SELECT * FROM table WHERE column IN %s;", ((1,2,3),)) 

것 출력 파이썬 새로운 올 사람을 위해

'SELECT * FROM table WHERE column IN (1,2,3);' 

: 그것은 여기 튜플이 아닌 목록을 사용하는 불행하게도 중요하다. 두 번째 예 :

cur.mogrify("SELECT * FROM table WHERE column IN %s;", 
    tuple([row[0] for for in rows])) 
+0

고맙습니다. 나는 그 사실을 눈치 채지 못했습니다. 솔루션의 유일한 문제는 그 튜플에서 쉼표를 잊어 버린 것입니다. –

+0

고마워 - 고치다 – philofinfinitejest

+25

Python LISTS가 Postgres ARRAY 유형으로 변환되므로 커서 질의 (...) 인수에 (tuple (SOME_LIST))와 같은 일을 자주해야한다는 것을 알게되었습니다. 단일 요소 리터럴 튜플에 목록의 튜플()을 래핑하는 방법에 유의하십시오. 따라서이 예 에서처럼 튜플의 튜플을 갖습니다. –