Почему Джанго не видит функцию postgres - PullRequest
0 голосов
/ 07 марта 2019

Существует такая функция:

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 Ответ

1 голос
/ 07 марта 2019

Я думаю, что у вас проблема с чувствительностью к регистру имен функций в PostgreSQL .

Попробуйте это:

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