web-dev-qa-db-ja.com

草刈りのポストギスジオメトリの挿入と選択

ゴラン、特にライブラリ gorm を使用して幾何学タイプを挿入して取得する方法を見つけようとしています。私はまたライブラリーを使用しようとしています orb ジオメトリのためのさまざまなタイプを定義し、異なるフォーマットの間でエンコード/復号化を提供します。

ORBは、Scan()Value()メソッドは各タイプに対して既に実装されています。これにより、GOのInsert()Scan()がプリミティブ以外の種類で動作するように機能します。 ORBは、よく知られているバイナリ(WKB)フォーマットで表されるジオメトリを使用することを期待しています。

ORBのマニュアルはこれを実現するために、それぞれの照会および挿入のためにPostGIS関数ST_AsBinary()およびST_GeomFromWKB()のフィールドを単にラップする必要があることを示しています。たとえば、次のように定義されている表を使用してください。

__, err = db.Exec(`
        CREATE TABLE IF NOT EXISTS orbtest (
            id SERIAL PRIMARY KEY,
            name TEXT NOT NULL,
            geom geometry(POLYGON, 4326) NOT NULL
        );
    `)
_

あなたはただそうすることができます:

_rows, err := db.Query("SELECT id, name, ST_AsBinary(geom) FROM orbtest LIMIT 1")
_

そしてinsertの場合(pはorb.pointです)。

_db.Exec("INSERT INTO orbtest (id, name, geom) VALUES ($1, $2, ST_GeomFromWKB($3))", 1, "Test", wkb.Value(p))
_

これが私の問題です:gormを使って、私はそれらの関数を使ってそれらのクエリを構築することができる贅沢を持っていません。 gormは、構造体を指定してデータベースに自動的に値を挿入し、構造体の階層全体にデータをスキャンします。これらScan()Value()メソッドは、私のコントロールなしでシーンの後ろに呼び出されます。

バイナリデータをジオメトリ列に直接挿入しようとし、ジオメトリ列を直接問い合わせることで、HEXに結果が得られます。

これを解決するために複数のデータベースアプローチを試しました。ジオメトリ列で必要な機能を自動的に呼び出すビューを作成しました。これはクエリのために機能しますが、挿入していませんでした。

入出力データに対して必要な機能を自動的に呼び出すであろう、ある種のトリガーまたはルールを作成することは可能ですか?

また、私がデータとスキーマとは完全に独立している作品で作業している図書館であることにも注意する必要があるので、あらゆる種類のクエリの贅沢を持っていません。私はもちろん、データモデル全体をスキャンし、最初からクエリを生成する機能を書くことができましたが、より良いオプションがあった場合はお手伝いします。

SQLでこの作品を作る方法を知っていますか?列自体を問い合わせるだけで、列の関数を自動的に呼び出すことができるのですか?

どんなアドバイスも大いに感謝されます。

13
robbieperry22

入出力データに対して必要な機能を自動的に呼び出すであろう、ある種のトリガーまたはルールを作成することは可能ですか?

今までに福ぬフックを試した、例:

type Example struct {
    ID   int
    Name string
    Geom ...
}

func (e *Example) AfterFind() (err error) {
    e.Geom = ... // Do whatever you like here
    return
}
 _

一握りがあります フック あなたが使うことができるもの。私は彼らがかなりきれいで便利です。

3
ifnotak