Psycopg2 с использованием подстановочных знаков вызывает TypeError - PullRequest
5 голосов
/ 15 октября 2010

В настоящее время я пытаюсь найти в базе данных определенные события. Мой запрос как таковой

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

Проще говоря, мне нужен запрос, чтобы просмотреть базу данных событий календаря и вернуть что-либо со сводкой «test» и после начала этого месяца.

Возвращает ожидаемые результаты при запросе из командной строки базы данных. Однако, когда я пытаюсь использовать его в моем скрипте Python с psycopg2 как таковой:

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

Я получаю сообщение об ошибке

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

При первоначальном поиске в Google это звучит как то, как я использую свои шаблоны. Хотя я могу ошибаться и, возможно, мне не хватает чего-то простого, чего я не вижу. Надеюсь, свежая пара глаз от сообщества может исправить мою нелюбовь;)

Ответы [ 2 ]

18 голосов
/ 15 октября 2010

Не уверен, что это полный корень вашей проблемы, но я думаю, что вам нужно экранировать символы подстановки, иначе логика параметризации запутается.

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

Я думаю, что %% - правильный выход, но это может быть \%

3 голосов
/ 16 июня 2011

я думаю, что-то о ваших "%" сбивает с толку питона. в psycopg2 я делаю мои «подобные» запросы с подстановочными знаками так:


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

с предоставленными пользователем поисковыми строками, как в этом сценарии, вы, вероятно, захотите экранировать любые "%" в них, которые, как я подозреваю, в противном случае были бы допустимыми подстановочными знаками в запросе, но я еще не дошел до этого

...