golang - драйвер mysql - функции базы данных

Я создал структуру для хранения пространственных типов и создал функцию сканирования, которая помогает запрашивать строки в моей базе данных. У меня проблемы с вставкой этого типа.

Я могу вставить данные, используя следующий sql;

INSERT INTO 'table' ('spot') VALUES (GeomFromText('POINT(10 10)'));

Если я использую интерфейс Value в database / sql / driver;

type Value interface {}

Значение - это значение, которое драйверы должны уметь обрабатывать. Это либо nil, либо экземпляр одного из следующих типов:

int64

float64

bool

[]байт

string [*] везде, кроме Rows.Next.

время. время

И используйте этот код;

func (p Point) Value() (driver.Value, error) {
    return "GeomFromText('" + p.ToWKT() + "')", nil
}

Я получаю следующий оператор sql, идущий в базу данных;

INSERT INTO 'table' ('spot') VALUES ('GeomFromText('POINT(10 10)')');

Проблема в том, что функция GeomFromText заключена в кавычки. Есть ли способ избежать этого сценария? Я использую gorm и стараюсь свести к минимуму сырые sql-запросы.

Тип mysql, используемый на стороне базы данных, является точкой.


person devfubar    schedule 11.12.2015    source источник
comment
обычно имена таблиц и столбцы заключаются в обратные тики или ничего. Например, обратный ход был бы впечатляющим, если бы имя столбца было limit, My Column или this-thing   -  person Drew    schedule 12.12.2015
comment
Вы пытались сохранить вызов функции GeomFromText в запросе и вернуть Point Value метод p.ToWKT()?   -  person jmaloney    schedule 12.12.2015
comment
Спасибо за ответы. Полагаю, я не прояснил свои трудности. У меня нет проблем со схемой, и я знаю, как вставлять пространственные данные, это скорее проблема с драйвером sql. Я знаю, что db.Exec("INSERT INTO 'table' ('spot') VALUES (GeomFromText($1))", p.ToWKT()) будет работать, однако я стараюсь избегать использования необработанных запросов sql в этом качестве. Я знаю, что мой код не работает, потому что func (p Point) Value() возвращает строку, а моя функция MySQL помещается в кавычки. Есть ли способ использовать этот интерфейс и заключить только часть строки в кавычки?   -  person devfubar    schedule 12.12.2015


Ответы (1)


Пожалуйста, посмотрите два URL-адреса ниже, откуда эта концепция была взята из

Схема

-- http://howto-use-mysql-spatial-ext.blogspot.com/

create table Points
(   id int auto_increment primary key,
    name VARCHAR(20) not null, 
    location Point NOT NULL, 
    description VARCHAR(200) not null, 
    SPATIAL INDEX(location),
    key(name)
)engine=MyISAM; -- for use of spatial indexes and avoiding error 1464

-- insert a row, so we can prove Update later will work
INSERT INTO Points (name, location, description) VALUES 
( 'point1' , GeomFromText( ' POINT(31.5 42.2) ' ) , 'some place');

Заявление об обновлении

-- concept borrowed from http://stackoverflow.com/a/7135890
UPDATE Points 
set location = PointFromText(CONCAT('POINT(',13.33,' ',26.48,')'))
where id=1;

Проверять

select * from points;

(когда вы открываете Редактор значений, чтобы увидеть большой двоичный объект, точка обновляется)

Итак, вывод - поиграем с concat() внутри оператора обновления.

person Drew    schedule 11.12.2015
comment
Я столкнулся с той же проблемой. Это пишет необработанный SQL-запрос? Я не понимаю, как ты заставляешь это работать. - person huggie; 05.03.2020