2011-12-29 26 views
27

Veritabanından almak için bir dizi ids listesi var. Ben python ve psycopg2 kullanıyorum ve benim sorunum, bu kimlikleri SQL'e etkili bir şekilde nasıl ileteceğinizdir? Demek istediğim, bu listenin uzunluğunu bilirsem oldukça kolaydır, çünkü gerektiğinde sorgu dizisine her zaman el ile veya otomatik olarak çok fazla "% s" ifadesi ekleyebilirim, fakat burada ne kadar ihtiyacım olduğunu bilmiyorum . Sql "id IN (id1, id2, ...)" deyimini kullanarak bu satırları seçmem gerekiyor. Listenin uzunluğunu kontrol etmenin ve "% s" dizisini sorgu dizisine birleştirmenin mümkün olduğunu biliyorum, ancak bunun çok yavaş ve çirkin olacağından korkuyorum. Herkesin nasıl çözeceği konusunda bir fikri var mı? Ve lütfen neden "IN" ifadesiyle yapmam gerektiğini sorma - sınıf ödevimin bir parçası olan bir ölçüt. Şimdiden teşekkürler!Parametreleri psycopg2'de SQL'e geçirme

+0

SQL yanıtına karşı mısınız? Dinamik SQL kullanarak, herhangi bir uzunlukta bir dize verebilir ve SQL'in doğru okumasını sağlayabilirsiniz. – Twelfth

cevap

47

Python küpe psycopg2 sql listelere dönüştürülür:

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

çıktılayacaktır Python yeni gelenler için

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

: Burada bir demet değil, bir liste kullanmak maalesef önemlidir. Ikinci örnek:

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

Teşekkür ederim, bunu fark etmedim. Çözümünüzle ilgili tek sorun, bu tuple'da virgül unuttuğunuz. –

+0

Teşekkürler - düzeltildi – philofinfinitejest

+25

Not: Python LISTS Postgres ARRAY türlerine dönüştürülecektir, bu yüzden cursor.execute (...) argümanlarında sık sık (tuple (SOME_LIST) gibi) bir şey yapmam gerektiğini buldum. Listenin tuple'ını() tek bir öğe literal tuple nasıl sardığımızı not edin, bu nedenle bu örnekte gösterildiği gibi bir tuple kopyasına sahibiz. –