Следующий запрос вынимает круглые скобки из строки, т.е. Это регулярное выражение заменяет их ничем. Он работает так, как ожидалось, когда я тестирую его в 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
""")
Параметрированные аргументы выглядят как ответ.
Используйте параметризованные аргументы:
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',)]