2017-03-28 10 views
0

私は、PostgreSQLの機能でplpythonuでこの割り当てを持っている:plpythonクエリで値が返されるかどうかをチェックする方法は?

result=plpy.execute("select value from table where doctitle like '%%%s%%'"%projectname) 
if result: 
    final = result[0]["value"] 

クエリは1つのテキスト結果や何を返すことができます。

問題は、クエリが何も返されない場合であればresult:条件は(それが値列が含まれているCuzの)...私はfinalへの代入は、値列の実際の値がある場合にのみ発生しますまだtrueであるということです。それをどうやって確認するのですか?

+0

カーソルが列ヘッダを返しませんが、それは空の配列(私は考えてリストを)返すんので、これは常にtrueになります。代わりにcount lenを使用する – Mokadillion

答えて

1

結果オブジェクトは、リストまたは辞書オブジェクトをエミュレートします。その長さをチェックしてください:

if len(result) > 0: 

しかし、あなたのテストは、空のリストや辞書として動作するはずですがFalseとして評価されます。

create or replace function p() 
returns boolean as $$ 

result = plpy.execute('select 1 as i where false') 
if result: return True 
else: return False 

$$ language plpythonu; 

戻りfalse

select p(); 
p 
--- 
f 

ではなく、中にexecuteにパラメータを渡します自分の代わりにそうしないと、SQLインジェクションの脆弱性になります。

query = """ 
    select value 
    from table 
    where doctitle like format('%%%s%%', $1) 
""" 
plan = plpy.prepare(query, ["text"]) 
result = plpy.execute(plan, [_text_parameter]) 
if result: 
    final = result[0]["value"] 

https://www.postgresql.org/docs/current/static/plpython-database.html