Я пытался найти способ вставлять и извлекать геометрические типы, используя Golang, в частности библиотеку 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")
И для вставки (где 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()
методы вызываются негласно, без моего контроля.
Попытка напрямую вставить двоичные данные в столбец геометрии не будет работать, и прямой запрос столбца геометрии даст результатв шестнадцатеричном.
Я пробовал несколько подходов к базе данных, чтобы решить эту проблему.Я попытался создать виды, которые автоматически вызывают необходимые функции в столбцах геометрии.Это сработало для запроса, но не для вставки.
Можно ли создать какой-то триггер или правило, которое бы автоматически вызывало необходимые функции для входящих / исходящих данных?
Я должен такжеобратите внимание, что библиотека, над которой я работаю, работает полностью независимо от данных и схем, поэтому у меня нет роскоши жестко кодировать какие-либо запросы.Конечно, я мог бы написать функцию, которая сканирует всю модель данных и генерирует запросы с нуля, но я бы предпочел, если бы был лучший вариант.
Кто-нибудь знает способ заставить эту работу работать в SQL?Возможность вызывать функции для столбца автоматически, просто запрашивая сам столбец?
Буду признателен за любой совет.