2010-10-15 18 views
5

Obecnie próbuję przeszukać bazę danych, aby pobrać określone zdarzenia. Moje zapytanie jest jako takiPsycopg2 przy użyciu symbolu wieloznacznego powoduje TypeError

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

Po prostu muszę zapytanie do przeglądania bazy zdarzeń kalendarza i nic powrócić z podsumowaniem z „test” w nim i po początku tego miesiąca.

Powoduje wyświetlenie oczekiwanych wyników przy zapytaniu z wiersza poleceń bazy danych. Jednak gdy próbuję użyć go w mój skrypt Pythona z psycopg2 jako takie:

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

pojawia się błąd typu

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

robi jakieś początkowe Googling to brzmi jak coś z okazji używam moje symbole wieloznaczne. Mogę się mylić i prawdopodobnie brakuje mi czegoś prostego, czego nie widzę. Mam nadzieję, że świeża para oczu od społeczności może poprawić moją nieobliczalność;)

Odpowiedz

14

Nie jestem pewien, czy to jest pełny root twojego problemu, ale myślę, że musisz uciec z twoich symboli wieloznacznych lub logika parametryzacji się pomyli.

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

myślę %% jest poprawny ucieka, ale to może być \%

+0

Hm, który to naprawi. Ale nie sądzę, że to jest główny problem, ponieważ próbowałem pozbyć się słownika i po prostu uruchomiłem linię bez podstawienia, aby sprawdzić, czy symbol wieloznaczny rzeczywiście nie został prawidłowo usunięty. Pozbycie się słownika zadziałało, więc dlaczego muszę uciec z symbolu wieloznacznego, gdy używany jest słownik? –

+0

Podstawowa substytucja parametru używa "%" jako znaku specjalnego, co oznacza "hej, zastąp tutaj wartość z mojego dyktatu". Domyślam się, że jeśli nie przejdziecie przez dyktando, ta logika parametryzacji zostanie pominięta całkowicie, więc nie ma szans, aby się pomylić z obecnością "%" w klauzuli where. Innymi słowy, prawdopodobnie dławi * w * kroku parametryzacji, którego już nie robisz. Tak więc, jeśli podajesz parametry, musisz uciec ze specjalnego znaku%, w przeciwnym razie nie. –

+0

OK, to ma sens. Dziękuję Panu! –

3

moje przypuszczenie jest coś o swojej „%” 's jest niejasna pytona. w psycopg2 dołożę wieloznacznego „jak” kwerendy tak:


#!/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() 

z użytkowników dostarczone ciągów wyszukiwania jak w tym skrypcie będzie prawdopodobnie chciał uniknąć jakichkolwiek „%” jest w nich, co podejrzewam, by w przeciwnym razie, w kwerendzie będą prawdziwe symbole wieloznaczne, ale nie dotarłem jeszcze do tego tak daleko,

Powiązane problemy