Буквальные скобки в запросе postgres, pgadmin vs. psycopg2 - PullRequest
1 голос
/ 18 июля 2011

Следующий запрос извлекает скобки из строки, т. Е. Регулярное выражение заменяет их ничем.Он работает, как и ожидалось, когда я тестирую его в pgAdimin III (1.12), но когда он входит в состав скрипта на python, использующего psycopg2, он вообще не заменяет скобки.1 с psycopg2 2.3.2, и моя ОС - SLES 11 SP1.

Я ожидаю, что запрос postgres, запущенный в pgAdmin, вернет те же точные результаты, что и запрос с psycopg2, или это неверное предположение?Я могу предоставить данные, если это необходимо, но location.name - это строка, например,

(козел) 172.10.xx -> / var / log / messages

EDIT : код Python:

cursor.execute("""
     SELECT
        regexp_replace(location.name, '\\(|\\)', '', 'g') AS host
     FROM
        location
""") 

Параметризованные аргументы выглядят как ответ.

1 Ответ

2 голосов
/ 18 июля 2011

Используйте параметризованные аргументы:

sql='SELECT regexp_replace(location, %s, %s, %s)  from foo'
cursor.execute(sql,[r'\(|\)','','g'])

Например:

import psycopg2
connection=psycopg2.connect(
    database=config.PGDB,
    host=config.HOST,
    password=config.PASS)
cursor=connection.cursor()
sql='CREATE TABLE foo (location varchar(40))'
cursor.execute(sql)
sql='INSERT INTO foo (location) VALUES (%s)'
cursor.execute(sql,['(goat) 172.10.x.x -> /var/log/messages'])
sql='SELECT * FROM foo'
cursor.execute(sql)
data=cursor.fetchall()
print(data)
# [('(goat) 172.10.x.x -> /var/log/messages',)]

sql='SELECT regexp_replace(location, %s, %s, %s) FROM foo'
cursor.execute(sql,[r'\(|\)','','g'])
data=cursor.fetchall()
print(data)
# [('goat 172.10.x.x -> /var/log/messages',)]
...