2017-01-25 6 views
2

Я использую pg-promise для доступа к нашей базе данных postgres. Я хочу вызвать хранимую процедуру foo(geom), которая принимает тип данных геометрии (PostGIS). У меня есть только lats/lng, но я хочу их конвертировать с помощью postGIS.pg-prom: передать функцию как параметр func()

Это выглядит следующим образом:

db.func('foo', 'ST_MakePoint(' + location.lat + ', ' + location.lng + ')') 
    .then((result) => { 
    console.log(bar); 
    }); 

Я получаю ошибку сейчас, жалуется, что у меня есть недопустимые геометрии (преобразование не происходит). Я уверен, что ST_MakePoint работает для значений, которые у меня есть. Я предполагаю, что он интерпретирует его как строку, а не как вызов функции при выполнении на db.

Как передать этот параметр, чтобы он работал?

ответ

2

Я являюсь автором pg-promise;)

В отличие от обычного запроса форматирования с pg-promise, где вы указываете ваш шаблон форматирования через переменные форматирования, вы пропускаете, что при использовании методов func и proc, и поэтому они вытекают из тип значений.

Наиболее элегантным решением является использование Custom Type Formatting, поддерживаемого библиотекой, что позволяет вам переопределить любой тип данных и предоставить собственное форматирование.

Вы можете ввести свой собственный класс Point так:

function Point(lat, lng) { 
    this.lat = +lat; 
    this.lng = +lng; 
    this._rawDBType = true; /* use as raw/unescaped value */ 
    this.formatDBType = function() { 
     return 'ST_MakePoint(' + this.lat + ',' + this.lng + ')'; 
    }; 
} 

Затем вы можете передать его в качестве обычного значения:

var p = new Point(1, 2); 

db.func('foo', r).then(...) 

В качестве альтернативы, вы можете выполнить запрос непосредственно. Не переоценивать метод func, который просто выполняет SELECT * FROM foo, так что вы можете сделать:

var p = 'ST_MakePoint(' + lat + ',' + lng + ')'; 

db.any('SELECT * FROM foo($1^)', p).then(...) 

^ = :raw - впрыскивает необработанное/неэкранированное значение.

P.S. В будущем, вместо того, чтобы гадать, что делает pg-promise, попробуйте pg-monitor вместо этого или, по крайней мере, обработать event query.

+0

Спасибо за замечание о pg-monitor! – KWyckmans