有这样的功能
def getNearestNotes(request, longitude, latitude):
if request.method == 'GET':
c = connection.cursor()
r = None
try:
c.callproc('GetAllNotes', (float(longitude), float(latitude)))
r = c.fetchall()
finally:
c.close()
return HttpResponse(str(r))
else:
return HttpResponse('needGetMethod')
它应该在postgresql数据库中调用这样的函数:
create function "GetAllNotes"(long numeric, lat numeric)
returns TABLE
(
UserId integer,
UserName character varying,
NoteName character varying,
NoteLong double precision,
NoteLat double precision
)
language plpgsql
as
$$
BEGIN
RETURN query (SELECT Notes."UserId", Users."Name", Notes."Name",
Notes."Longitude", Notes."Latitude"
FROM Notes
INNER JOIN Users ON Notes."UserId" = Users."Id"
WHERE (point(long, lat) <@> point(Notes."Longitude",
Notes."Latitude") <= 0.124274));
END
$$;
alter function "GetAllNotes"(numeric, numeric) owner to postgres;
但是当调用此函数时,django给出了一个错误-
函数getallnotes(数字,数字)不存在 第1行:SELECT * FROM GetAllNotes(28.0,23.0)
提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
基座已连接。
但是,如果我这样做-
c.execute("SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public'")
r = c.fetchone()
-然后将列出“ GetAllNotes”功能
答案 0 :(得分:1)
我认为您遇到case sensitivity of function names in PostgreSQL的问题。
尝试一下:
c.callproc('"GetAllNotes"', (float(longitude), float(latitude)))