Django为什么看不到postgres函数

时间:2019-03-07 11:43:17

标签: python django psycopg2

有这样的功能

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”功能

1 个答案:

答案 0 :(得分:1)

我认为您遇到case sensitivity of function names in PostgreSQL的问题。

尝试一下:

c.callproc('"GetAllNotes"', (float(longitude), float(latitude)))