2010-10-15 24 views
5

Belirli olayları yakalamak için bir veritabanında arama yapmaya çalışıyorum. Benim sorgu Basitçe ben takvim olayların bir veri tabanı üzerinden bakmak ve içinde ve bu ay başında sonra 'test' ile özetiyle şey dönmek için sorgu ihtiyaç koymak Joker kullanarak Psycopg2 neden TypeError

SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > '2010-10-01' 

gibi olduğunu.

Bu, veritabanı komut satırından sorgulandığında beklenen sonuçları döndürür. Ben gibi psycopg2 ile benim Python komut kullanmak girişiminde Ancak zaman:

cursor.execute("SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > %(begin)s ", {'begin' : datetime.datetime(2010,10,1) }) 

Bir tür hatası

*** TypeError: 'dict' object does not support indexing 

ben kullanıyorum yolu ile bir şey gibi geliyor Googling bazı ilk Doing olsun benim joker karakterlerim. Yine de yanılıyor olabilirim ve muhtemelen görmediğim basit bir şeyi özlüyorum. Umarım topluluğun yeni bir çift gözü, noobishness'imi düzeltebilir;)

cevap

14

Sorunun tam kökü olup olmadığından emin değilim, ama joker karakterlerden kaçmanız gerektiğini veya parametrelendirme mantığının kafanız karışacağını düşünüyorum.

SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s 

Ben %% doğru kaçış olduğunu düşünüyorum, ama

+0

Hm. Ama ben, bu sözlükten kurtulmak ve sadece joker karakterin gerçekten kaçmadığından emin olmak için herhangi bir değişiklik olmaksızın koşmak zorunda kaldığım için uğraştığım için asıl sorun olduğuna inanmıyorum. Sözlükden kurtulmak için bir sözlük kullanıldığında neden joker karakterden kaçmalıyım? –

+0

Temel parametre değiştirme işlemi '%' ifadesini özel bir karakter olarak kullanır; bu, 'hey, burada benim tarifemden bir değer alır' anlamına gelir. Tahminimce, eğer bu kuralı geçmezseniz, bu parametreleme mantığı tamamen atlanır, böylece nerede bulunduğunuz maddede '%' varlığı ile karıştırılmasının bir şansı yoktur. Diğer bir deyişle, muhtemelen artık yapmadığınız parametre adımı * içinde boğulma olasılığı vardır. Yani parametrelerden geçiyorsanız, özel% karakterden kaçmanız gerekir, aksi halde değil. –

+0

Tamam, bu mantıklı. Teşekkürler bayım! –

3

benim tahminim 'ın piton kafa karıştırıcı senin "%" ile ilgili bir şeydir \% olabilir. psycopg2 i böyle sorgular "gibi" my joker yapın:

kullanıcı tarafından sağlanan arama dizeleri ile

#!/usr/bin/python 

import sys,os.path,psycopg2 
db=psycopg2.connect("dbname=music") 

for line in sys.argv[1::]: 
    cursor=db.cursor() 
    key="%"+line+"%" 
    cursor.execute("select count(*) from pool where path like %s",(key,)) 
    if cursor.fetchone()[0] != 1: 
     sys.stderr.write("ambiguous stem or no such song") 
     sys.exit(-1) 
    cursor.execute("insert into spool select path from pool where path like %s",(key,)) 
    cursor.close() 
    db.commit() 
db.close() 

bu komut muhtemelen isterim şüphelendiğiniz "%" 'ler onları dışarı kaçmak isteyeyim gibi Aksi takdirde sorgudaki yasal joker karakterler olabilir, ancak bunu düzeltemediğim

İlgili konular