Использование подстановочного знака% с pg8000

У меня есть запрос, похожий на ниже:

def connection():
    pcon = pg8000.connect(host='host', port=1234, user='user', password='password', database = 'database')
    return pcon, pcon.cursor()

pcon, pcur = connection()
query = """ SELECT * FROM db WHERE (db.foo LIKE 'string-%' OR db.foo LIKE 'bar-%')"""
db = pd.read_sql_query(query, pcon)

Однако, когда я пытаюсь запустить код, я получаю:

DatabaseError: '%'' not supported in a quoted string within the query string

Я попытался избежать символа с \ и дополнительным% без удачи. Как я могу заставить pg8000 правильно воспринимать это как шаблон?

2 ответа

Решение

"В Python, % обычно ссылается на переменную, которая следует за строкой. Если вы хотите буквальный знак процента, то вам нужно удвоить его. %%"

- Источник

LIKE 'string-%%'

В противном случае, если это не сработает, PostgreSQL также поддерживает подчеркивания для сопоставления с образцом.

'abc' LIKE 'abc'    true
'abc' LIKE 'a%'     true
'abc' LIKE '_b_'    true

Но, как уже упоминалось в комментариях,

Подчеркивание (_) в pattern обозначает (соответствует) любой отдельный символ; знак процента (%) соответствует любой последовательности из нуля или более символов


Однако, согласно исходному коду, проблема заключается в том, что после % в вашем LIKE заявление.

if next_c == "%":
    in_param_escape = True
else:
    raise InterfaceError(
        "'%" + next_c + "' not supported in a quoted "
        "string within the query string")

Так что если next_c == "'" вместо next_c == "%"тогда вы получите свою ошибку

'%'' not supported in a quoted string within the query string

С последней версией pg8000 у вас не должно возникнуть проблем с % в LIKE. Например:

      >>> import pg8000.dbapi
>>>
>>> con = pg8000.dbapi.connect(user="postgres", password="cpsnow")
>>> cur = con.cursor()
>>> cur.execute("CREATE TEMPORARY TABLE book (id SERIAL, title TEXT)")
>>> for title in ("Ender's Game", "The Magus"):
...     cur.execute("INSERT INTO book (title) VALUES (%s)", [title])
>>>
>>> cur.execute("SELECT * from book WHERE title LIKE 'The %'")
>>> cur.fetchall()
([2, 'The Magus'],)
Другие вопросы по тегам