我无法在python中获取光标

时间:2017-09-17 22:07:00

标签: python sql postgresql

我正在使用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;

这是我的python函数

 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"

结果:

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

1 个答案:

答案 0 :(得分:1)

正如Abelisto所提到的那样,在调用一个过程时,你需要先得到游标的名字。使用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.')