2

次のクエリは、文字列から括弧を取り出します。つまり、正規表現は括弧を何も置き換えません。pgAdimin III (1.12) でテストすると期待どおりに動作しますが、psycopg2 を使用する python スクリプトの一部である場合、括弧はまったく置き換えられません。

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

psycopg2 2.3.2 で python 2.7.1 を実行しており、私の OS は SLES 11 SP1 です。

pgAdmin で実行された postgres クエリは、psycopg2 で実行されたものとまったく同じ結果を返すと思いますか、それとも間違った仮定ですか? 必要に応じてデータを提供できますlocation.nameが、文字列です。

(ヤギ) 172.10.xx -> /var/log/messages

編集: Python コード:

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

パラメータ化された引数は答えのように見えます。

4

1 に答える 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',)]
于 2011-07-18T17:24:48.890 に答える