2017-09-17 3 views
2

私はpygtonからpostgresql関数と呼び出しを使用しています。カーソルをフェッチすることはできません。私はPythonでカーソルをフェッチできません。

これは私のpostgresql機能です。

CREATE LANGUAGE plpgsql; 
     create or replace FUNCTION getPerson() returns REFCURSOR 
      AS $$ 
     DECLARE 
     p_cursor refcursor; 
     BEGIN 
      open p_cursor FOR 
      select m.name AS name, m.surname AS surname from person m; 
      RETURN p_cursor; 
     END; $$ 
     LANGUAGE plpgsql; 

これは

import psycopg2  
    try: 
     conn = psycopg2.connect(database="dt", user = "us", password = "pass", host = "127.0.0.1", port = "5432") 

     cur = conn.cursor() 
     res = cur.callproc('getPerson') 
     result = cur.fetchall() 

     for row in result: 
      print "printed row" 
      print row 

     conn.commit() 
     cur.close() 
     conn.close() 

    except:  
     print "error" 

RESULT私のPythonの関数である:Abelistoは、プロシージャを呼び出すときに、あなたが最初のカーソルの名前を取得する必要があり、mentionnedとして

printed row 
('<unnamed portal 1>',) 
+1

あなたは追加のステップを行う必要があります。 'からすべてのフェッチのためのさらに別のカーソルを作成します"<無名ポータル1>"(関数によって返された名前を使用)し、そこからデータを取得します。 – Abelisto

答えて

1

。 psycopg2で、それはです:その後、

res = cur.callproc('getPerson') 
row = cur.fetchone() 

別に進むには、クエリのFETCH:

cur.execute(f'FETCH ALL IN "{row[0]}"') #Note: python 3.6 
results = cur.fetchall() 

全コード:

import psycopg2  
try: 
    conn = psycopg2.connect(database="dt", user = "us", password = "pass", host = "127.0.0.1", port = "5432") 
    cur = conn.cursor() 

    res = cur.callproc('getPerson') 
    row = cur.fetchone() 

    cur.execute(f'FETCH ALL IN "{row[0]}"') 
    results = cur.fetchall() 

    for row in results: 
     print row 

    cur.close() 

except (Exception, psycopg2.DatabaseError) as error: 
    print(error) 
finally: 
    if conn is not None: 
     conn.close() 
     print('Database connection closed.') 
関連する問題