Postgres запрос с параметром '%%' не возвращает результаты через psycopg2 - PullRequest
0 голосов
/ 30 января 2020

Когда я выполняю приведенный ниже запрос в редакторе запросов, таком как DBeaver - он возвращает результат, но если я выполняю тот же запрос через Python & psycopg2, он не возвращает результат. '%%' должно соответствовать любому заголовку / местоположению, поэтому всегда будет что-то возвращаться. Я просто проверяю это для категории без ключевых слов, но также будет принимать массив ключевых слов, если они существуют в зависимости от категории. Таким образом, массив может быть ['%%'] или ['% boston%', '% cambridge%'] и оба должны работать.

select title, link
from internal.jobs 
where (title ilike any(array['%%'])
or location ilike any(array['%%']))
order by "publishDate" desc
limit 1;

Я попытался добавить флаг E в начале строки. Например, E '%%'

Python:

import psycopg2

FILTERS = {
    'AllJobs': [],
    'BostonJobs': ['boston', 'cambridge'],
    'MachineLearningJobs': ['ml', 'machine learning']
}

conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()

sql = """
select title, link
from internal.jobs 
where (title ilike any(array[%s])
or location ilike any(array[%s]))
order by "publishDate" desc
limit 1;
"""

for title, tags in FILTERS.items():
    if not tags:
        formatted_filters = "'%%'" # Will match any record
    else:
        formatted_filters = ','.join([f"'%{keyword}%'" for keyword in tags])

    cur.execute(sql, (formatted_filters))
    results = cur.fetchone()
    print(results)

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы можете использовать запрос cur.mogrify() для просмотра окончательно сгенерированного SQL, отметьте psql, работает ли он, и как вам нужно его настроить.

Скорее всего, вам придется удвоить каждый %.

0 голосов
/ 01 февраля 2020

Спасибо Пиро за очень полезную подсказку cur.mogrify(). Это помогло мне в дальнейшей отладке запроса, чтобы выяснить, что идет не так.

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

Обновлено код:

import psycopg2

FILTERS = {
    'AllJobs': [],
    'BostonJobs': ['boston', 'cambridge'],
    'MachineLearningJobs': ['ml', 'machine learning']
}

conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()

sql = """
select title, link
from internal.jobs 
where (title ilike any(array[%(filter)s])
or location ilike any(array[%(filter)s]))
order by "publishDate" desc
limit 1;
"""

for title, tags in FILTERS.items():
    if not tags:
        formatted_filters = '%%' # Will match any record
    else:
        formatted_filters = [f'%{keyword}%' for keyword in tags]

    print(cur.mogrify(sql, {'filter': formatted_filters}))
    cur.execute(sql, {'filter': formatted_filters})
    results = cur.fetchone()
    print(results)
...