2011-07-18 51 views
1

以下查詢從字符串中取出括號,即它用正則表達式替換它們。當我在pgAdimin III(1.12)中測試它時,它的工作方式與預期相符,但是當使用psycopg2的python腳本的一部分時,它根本不替換括號。postgres查詢中的文字圓括號,pgadmin與psycopg2

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

我使用psycopg2 2.3.2運行python 2.7.1,我的操作系統是SLES 11 SP1。

我希望在pgAdmin中運行的postgres查詢返回的結果與使用psycopg2運行的結果完全相同,或者是不正確的假設?我可以根據需要提供數據,但location.name是一個字符串,例如

(山羊)172.10.x.x - >在/ var/log/messages中

編輯:Python代碼:

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

參數化的參數看起來像答案。

+1

發佈Python代碼 –

回答

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,使用參數的伎倆。 – Banjer