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()

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

Другие вопросы по тегам