Язык Go и PostgreSQL 9.4

Существует ли библиотека PostgreSQL для языка Go, которая поддерживает PostgreSQL версии 9.4. PostgreSQL 9.4 поддерживает тип данных JSON, и вам интересно, можно ли его использовать с языком Go?

Спасибо.


person Ganesh    schedule 14.04.2015    source источник


Ответы (2)


Да, библиотека go pq должна поддерживать PostgreSQL v9.4 и имеет базовую поддержку типов JSON в виде строк ( которые, кажется, были добавлены в v9.2).

// CREATE TABLE foo (id SERIAL PRIMARY KEY, stuff json);
// INSERT INTO foo (stuff) VALUES ('{"x":123}');

type Foo struct {
  Id    int,
  Stuff string,
}

rows, err := db.Query("SELECT * FROM foo LIMIT 1") // TODO: handle error
defer rows.Close()
for rows.Next() {
  foo := Foo{}
  err = rows.Scan(&foo.Id, &foo.Stuff) // TODO: handle error
  # main.Foo{Id:1, Stuff:"{\"x\":123}"}
}

Вы можете либо обработать строку JSON, либо создать собственный тип с помощью специального метода «Сканировать»:

type Foo struct {
  Id    int,
  Stuff MyStuff,
}

func (e *MyStuff) Scan(value interface{}) error {
  // Value should be a []byte of the JSON string.
  // Do whatever you want with it here...
}
person maerics    schedule 14.04.2015
comment
Пожалуйста, не игнорируйте ошибки в примере кода (это практически неверный код по определению). Вы знаете, что какой-то дурак слепо вырежет и вставит его и войдет в привычку делать это таким образом, а затем усложнит жизнь другому ответчику SO, задав вопрос, заполненный кодом, игнорируя ошибки, которые сказали бы им, в чем их проблема. . ‹/разглагольствование› - person Dave C; 14.04.2015
comment
@DaveC: конечно, это законно, но я, честно говоря, разрываюсь на эту тему. Обычно я стараюсь публиковать как можно меньше кода, чтобы четко продемонстрировать свои намерения (вместо того, чтобы утопать в деталях), поэтому такие вещи, как обработка ошибок и очистка, часто опускаются. Разве я обязан следить за тем, чтобы этот дурак-копильщик не оторвал себе ногу? - person maerics; 14.04.2015
comment
@DaveC: я разместил мета-вопрос, потому что думаю, что ваша точка зрения верна example-code-or-opt-for-conciseness" title="Должен ли я продемонстрировать лучшие практики в примере кода или выбрать краткость">meta.stackoverflow.com/questions/290223/ - person maerics; 14.04.2015
comment
Действительно, рассмотрение всех возможных случаев в простом ответе может довольно быстро стать отвлекающе многословным. Я бы не жаловался, за исключением того, что я вижу слишком много вопросов SO, на которые нельзя ответить, не зная игнорируемых ошибок; они откуда-то берут свои примеры. Лично я, по крайней мере, написал панику или // check error!! комментарий; (это еще более скрыто для таких вещей, как rows.Scan). - person Dave C; 14.04.2015
comment
Обратите внимание, что базовый тип данных JSON был добавлен в версии 9.2. Postgresql 9.4 добавляет тип данных jsonb, который поддерживает расширенный набор операторов. - person Dmitri Goldring; 15.04.2015
comment
@DmitriGoldring: круто, спасибо за информацию - я обновил свой ответ, чтобы упомянуть об этом. - person maerics; 15.04.2015

Я использую jmoiron/sqlx. Для любых не распространенных типов данных вы можете реализовать интерфейсы valuer и scanner. Я сделал это для географических точек с Postgis, используя этот пакет.

person rafroehlich2    schedule 14.04.2015