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

2 投票
1 回答
1810 浏览
提问于 2025-04-16 21:46

下面这个查询是用来去掉字符串中的括号的,也就是说,它用正则表达式把括号替换成了空的东西。在我用pgAdmin III (1.12)测试的时候,它的表现是正常的,但当我把它放到一个使用psycopg2的Python脚本里时,括号根本没有被替换。

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

我现在用的是Python 2.7.1和psycopg2 2.3.2,操作系统是SLES 11 SP1。

我本来以为在pgAdmin中运行的Postgres查询,结果应该和用psycopg2运行的结果完全一样,这个想法对吗?如果需要的话我可以提供数据,但location.name是一个字符串,比如:

(goat) 172.10.x.x -> /var/log/messages

编辑:Python代码:

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

看起来参数化的参数是答案所在。

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',)]

撰写回答