Python - Psycopg2, как смешивать кортежи и строки в cur.execute ()? - PullRequest
1 голос
/ 15 марта 2012

Я новичок в 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?

Есть какие-нибудь подсказки?

С наилучшими пожеланиями,

1 Ответ

2 голосов
/ 15 марта 2012
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 не будет заменять идентификаторы, такие как имена столбцов, поэтому вы должны заменить их перед передачей запроса в качестве первого аргумента метода.

...