Psycopg2 с использованием подстановочных знаков вызывает TypeError
В настоящее время я пытаюсь найти в базе данных определенные события. Мой запрос как таковой
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 ответа
Не уверен, что это полный корень вашей проблемы, но я думаю, что вам нужно экранировать символы подстановки, иначе логика параметризации запутается.
SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s
Я думаю, %% - это правильный выход, но это может быть \%
Я думаю, что-то о ваших "%" сбивает с толку питона. в 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()
с предоставленными пользователем поисковыми строками, такими как в этом сценарии, вы, вероятно, захотите экранировать любые "%" в них, которые, как я подозреваю, в противном случае были бы допустимыми подстановочными знаками в запросе, но я еще не дошел до этого