Python / psycopg2 câu lệnh WHERE IN


81

Phương pháp chính xác để có sẵn danh sách (countryList) thông qua% s trong câu lệnh SQL là gì?

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

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

Như hiện tại, nó đã xảy ra lỗi sau khi cố gắng chạy "WHERE country in (ARRAY [...])". Có cách nào để làm điều này khác ngoài thao tác chuỗi không?

Cảm ơn

Câu trả lời:


133

Đối với INtoán tử, bạn muốn một bộ giá trị thay vì danh sách và loại bỏ dấu ngoặc đơn khỏi chuỗi SQL.

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

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

Trong quá trình gỡ lỗi, bạn có thể kiểm tra xem SQL có được xây dựng đúng cách với

cur.mogrify(sql, (data,))

Cảm ơn đã phản ứng nhanh chóng!
Matt,

1
Nếu bạn gặp khó khăn ngay cả sau khi đọc câu trả lời này, hãy đọc lại thật chậm. Đó là một bộ giá trị và bạn phải loại bỏ các parans xung quanh% s nếu bạn có chúng ở đó. Điều này khiến tôi vấp phải vì một thử nghiệm đơn giản hơn của tôi chỉ sử dụng một giá trị duy nhất và mọi thứ đều hoạt động. Chỉ cần làm theo điều này chính xác như Bryan đã viết ra.
zachaysan

40

Để giải thích một chút về câu trả lời và giải quyết các tham số được đặt tên và chuyển đổi danh sách thành các bộ giá trị:

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
Cảm ơn bạn vì mẹo đã chuyển trong một bài đọc. Điều đó tốt hơn nhiều.
Jack

Điều này có thể được thực hiện với nhiều mệnh đề WHERE x IN và nhiều danh sách trong từ điển không?
Odisseo

1
Đính chính: @Odisseo Vâng, với OR toàn năng. Vd: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

12

Bạn có thể sử dụng danh sách python trực tiếp như bên dưới. Nó hoạt động giống như toán tử IN trong SQL và cũng xử lý một danh sách trống mà không gây ra bất kỳ lỗi nào.

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

nguồn: http://initd.org/psycopg/docs/usage.html#lists-adaptation


Cũng có thể sử dụng câu trả lời được chấp nhận nhưng với cur.execute(sql, (tuple(data),))
Adam Hughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.