postgres查询中的字面括号,pgadmin与psycopg2

时间:2011-07-18 16:43:21

标签: python postgresql pgadmin

以下查询从字符串中取出括号,即正则表达式将其替换为空。当我在pgAdimin III(1.12)中测试它时,它按预期工作,但是当使用psycopg2的python脚本的一部分时,它根本不替换括号。

 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是一个字符串,例如

  

(goat)172.10.x.x - >的/ var /日志/消息

编辑:Python代码:

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

参数化的参数看起来像答案。

1 个答案:

答案 0 :(得分: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',)]