cursor.fetchall()仅返回函数游标的默认值(不运行fetch all)

时间:2016-01-27 04:21:57

标签: python sql django postgresql

我在尝试通过我在数据库中创建的函数(使用postgresql + postgis)提取数据时遇到了一些麻烦。这种情况是,每当我运行我的查询时,可以通过sql单独找到我的函数,它运行得很好并返回我的数据。

我的功能看起来像这样

CREATE OR REPLACE FUNCTION common.myfunc(string) RETURNS refcursor AS 
    $BODY$ 
    DECLARE
         ref refcursor default 'outrefcursor' 
    BEGIN
         OPEN ref FOR

         -- pretty big query here

         RETURN ref; END;
    $BODY$   LANGUAGE plpgsql VOLATILE

当我跑步时

SELECT common.myfunc(string);
FETCH ALL IN outrefcursor;

一切正常

然而,当我做我的django时

cursor.execute("SELECT * FROM common.myfunc(someString)")
mydata = cursor.fetchall()

它返回光标的默认值 fetchall() behavior

我非常感谢能帮助解决这种奇怪的行为

1 个答案:

答案 0 :(得分:0)

解决了。这笔交易是:如果你需要运行一个sql函数,然后运行fetch all in cursor,你必须明确地和原子地运行它。

例如,

你运行你的功能

SELECT common.myfunc(string);
FETCH ALL IN outrefcursor;

首先,django的cursor.fetchall()不会为你做FETCH ALL IN ---。它必须明确作为命令。但是,如果运行cursor.execute("SELECT * FROM common.myfunc(someString)"),django将自动提交此命令并失去对从查询返回的游标的跟踪。诀窍是用@transaction.atomic

包装您的视图

按照示例

@transaction.atomic
def func(request):
cursor = connection.cursor()
    try:
        cursor.execute("SELECT myfunc('"+ parameter +"')")
        cursor.execute('FETCH ALL IN "outrefcursor"')
        data = cursor.fetchall()
    finally:
        cursor.close()