2017-01-25 14 views
2

pg-promiseを使用して私たちのpostgresデータベースにアクセスしています。私はジオメトリデータ型(PostGIS)を受け付けるストアドプロシージャfoo(geom)を呼びたいと思います。私はラッツ/ lngだけを持っているので、postGISを使って変換したいと思っています。pg-promise:func()にパラメータとして関数を渡します

これは、次のようになります。

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

私は(変換は発生しません)無効なジオメトリを持っていることを訴えて、今エラーが発生します。私は値がST_MakePointであると確信しています。私はそれを文字列として解釈し、dbで実行されるときは関数呼び出しとして解釈しないと思います。

有効にするには、このパラメータをどのように渡す必要がありますか?

答えて

2

私はpg-promiseの作者だ;方法funcprocを使用した場合)あなたは、フォーマット変数を通して、あなたの書式テンプレートを指定pg-promise、でフォーマットする通常のクエリとは異なり

は、あなたが飛ばしていること、およびので、彼らはから暗示されています値の型

最も洗練された解決策は、ライブラリでサポートされている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(...) 

、あなたが直接あなたのクエリを実行することができます。あなたが行うことができますので、単純にSELECT * FROM fooを実行する方法funcを過大評価しないように:= :raw

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

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

^を - エスケープ/生の値を挿入します。

P.S.将来、pg-promiseが何を実行するかを推測するのではなく、pg-monitorか、少なくともevent queryを処理してみてください。

+0

pg-monitorに関するご意見ありがとうございます! – KWyckmans

関連する問題