Python — Psycopg2, как смешивать кортежи и строки в cur.execute()?

Я новичок в Python и Psycopg2... Я пытаюсь выполнить запрос, который использует оператор IN sql и другие предложения WHERE, но получаю такую ​​ошибку:

psycopg2.ProgrammingError: argument formats can't be mixed

Насколько я понимаю, я смешиваю кортеж Python со строками, вот оператор SELECT:

cur2.execute("SELECT hash FROM jobsads_text\
                     WHERE\
                     date_inserted::timestamp::date - now()::timestamp::date <= 0\
                     AND date_inserted::timestamp::date - now()::timestamp::date >= -7\
                     AND hash NOT IN %s \
                     AND lower((%s)) LIKE '%(%s)%'\
                     ORDER BY date_inserted asc;", ((not_in_sql,), search_field, search_string))

Я получаю ошибку в запросе выше.

Этот запрос ниже работает нормально:

cur2.execute("SELECT hash FROM jobsads_text\
                     WHERE\
                     date_inserted::timestamp::date - now()::timestamp::date <= 0\
                     AND date_inserted::timestamp::date - now()::timestamp::date >= -7\
                     AND hash NOT IN %s \
                     ORDER BY date_inserted asc;", (not_in_sql,))

Мой вопрос... Как я могу смешать кортеж not_in_sql со строками search_field и search_string?

Любые подсказки?

С уважением,


person IceSquad    schedule 14.03.2012    source источник


Ответы (1)


t = (1, 3)
search_field = 'c'
search_string = '%something%'
print cursor.mogrify("""\
    select * 
    from p
    where 
        c in %%s
        and
        lower (%s) like %%s
    """ % search_field, (t, search_string))

Выведет это:

select * 
from p
where 
    c in (1, 3)
    and
    lower (c) like '%something%'

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

person Clodoaldo Neto    schedule 15.03.2012