Python / psycopg2 WHERE IN 문


81

SQL 문에서 % s를 통해 목록 (countryList)을 사용할 수있는 올바른 방법은 무엇입니까?

# using psycopg2
countryList=['UK','France']

sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)

지금처럼 "WHERE country in (ARRAY [...])"를 실행하려고하면 오류가 발생합니다. 문자열 조작 이외의 다른 방법이 있습니까?

감사

답변:


133

를 들어 IN운영자, 당신은 원하는 튜플 대신 목록 SQL 문자열에서, 그리고 제거 괄호.

# using psycopg2
data=('UK','France')

sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))

디버깅하는 동안 다음을 사용하여 SQL이 올바르게 빌드되었는지 확인할 수 있습니다.

cur.mogrify(sql, (data,))

빠른 답변 감사합니다!
Matt

1
이 답변을 읽은 후에도 문제가 있으면 아주 천천히 다시 읽으십시오. 튜플의 튜플이며 % s 주변에있는 매개 변수가 있다면 제거해야합니다. 더 간단한 테스트에서는 단일 값만 사용하고 모든 것이 작동했기 때문에 이것은 나를 넘어 뜨 렸습니다. Bryan이 작성한대로 정확히 따르십시오.
zachaysan

40

대답을 조금 설명하고 명명 된 매개 변수를 처리하고 목록을 튜플로 변환하려면 다음을 수행하십시오.

countryList = ['UK', 'France']

sql = 'SELECT * from countries WHERE country IN %(countryList)s'

cur.execute(sql, { # You can pass a dict for named parameters rather than a tuple. Makes debugging hella easier.
    'countryList': tuple(countryList), # Converts the list to a tuple.
})

1
dict 전달에 대한 팁을 주셔서 감사합니다. 훨씬 낫습니다.
Jack

여러 WHERE x IN 절과 사전의 여러 목록으로 구현할 수 있습니까?
Odisseo

1
정정 : @Odisseo 예, 전능하신 OR로. 예 :cur.execute("SELECT * FROM table WHERE col IN %(list1)s OR col IN %(list2)s", {'list1': tuple(1,2,3), 'list2' = tuple(4,5,6)})
Joshua Burns

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.