4

postgresql 9.2 を使用して plpython 関数を作成しています。hstore 文字列を返すクエリがコードで既に実行されているとします。次に、クエリを発行したいと思います。

SELECT hstore_to_matrix('hstorestring')

hstore 文字列を含む文字列であるとしましょう。A=>B

create or replace function testfreq() 
returns text
as $$
hstorestring = '"GT"=>"thing","HS"=>"[-0.1,-0.2]"'
rv2 = plpy.execute("SELECT hstore_to_matrix(%s)" % (plpy.quote_literal(hstorestring)))
plpy.log("Hstore:",rv2[0])
return("done")
$$ LANGUAGE plpythonu;

として実行

select testfreq();

戻り値

testdb=# select testfreq();
ERROR:  plpy.Error: unrecognized error in PLy_spi_execute_fetch_result
CONTEXT:  Traceback (most recent call last):
PL/Python function "testfreq", line 3, in <module>
rv2 = plpy.execute("SELECT hstore_to_matrix(%s)" % (plpy.quote_literal(hstorestring)))
PL/Python function "testfreq":  

上記のコードで hstore_to_array に置き換えると、出力は次のようになります。

testdb=# select testfreq();
LOG:  ('Hstore:', {'hstore_to_array': ['GT', 'thing', 'HS', '[-0.1,-0.2]']})
CONTEXT:  PL/Python function "testfreq"
testfreq 
----------
done
(1 row)

また、関数の代わりに hstore 演算子を使用しようとしました。これらの関数を pgsql ターミナルで試して、Python に埋め込まれていないときに機能することを確認しました。任意のポインタをいただければ幸いです。

4

1 に答える 1

2

PL/Python は多次元配列を正しく処理していないようです:

create or replace function testarray()
returns text
as $$
rv2 = plpy.execute("SELECT ARRAY[ ARRAY['1','2','3'], ARRAY['a','b','c'] ];" )
$$ LANGUAGE plpythonu;

結果:

craig=# select testarray();
ERROR:  plpy.Error: unrecognized error in PLy_spi_execute_fetch_result
CONTEXT:  Traceback (most recent call last):
  PL/Python function "testarray", line 2, in <module>
    rv2 = plpy.execute("SELECT ARRAY[ ARRAY['1','2','3'], ARRAY['a','b','c'] ];" )
PL/Python function "testarray"

(Pg 9.2.4、Python 2.7.3 でテスト済み)。

hstore テキストは有効です。

craig=# SELECT '"GT"=>"thing","HS"=>"[-0.1,-0.2]"'::hstore;
               hstore               
------------------------------------
 "GT"=>"thing", "HS"=>"[-0.1,-0.2]"
(1 row)

クエリは PL/Python の外部で機能します。

craig=# select hstore_to_matrix('"GT"=>"thing","HS"=>"[-0.1,-0.2]"');
        hstore_to_matrix         
---------------------------------
 {{GT,thing},{HS,"[-0.1,-0.2]"}}
(1 row)

これがPL/Pythonの問題であることをさらに示唆しています。

効率的ではありませんが、 にキャストし、結果を返した後に にtextキャストすることで、おそらくこれを回避できます。text[]

create or replace function testfreq() 
returns text
as $$
hstorestring = '"GT"=>"thing","HS"=>"[-0.1,-0.2]"'
rv2 = plpy.execute("SELECT hstore_to_matrix(%s)::text" % (plpy.quote_literal(hstorestring)))
plpy.log("Hstore:",rv2[0])                                                                                                                                                     
return("done")                                                                                                                                                                 
$$ LANGUAGE plpythonu; 

結果:

craig=# SELECT testfreq();
 testfreq 
----------
 done
(1 row)
于 2013-04-18T00:36:26.930 に答える