我在尝试通过我在数据库中创建的函数(使用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()
我非常感谢能帮助解决这种奇怪的行为
答案 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()