Буквальные скобки в запросе postgres, pgadmin vs. psycopg2

1

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

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

Я запускаю python 2.7.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
    опубликовать код Python
Теги:
pgadmin

1 ответ

2
Лучший ответ

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

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',)]
  • 0
    Спасибо unutbu, используя параметры сделали свое дело.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню