sql. Ряды с ломтиками строк - PullRequest
0 голосов
/ 23 января 2020

Я использую стандартный пакет go sql для взаимодействия с AWS Афиной. Мой запрос возвращает для каждой записи uuid (строку) и массив писем.

Вот код:

package main


import (
  "fmt"
  "database/sql"
  _ "github.com/segmentio/go-athena"
  _"encoding/json"
)

type Contact struct {
  userid string
  emails []string
}


func main() {
  fmt.Println("hello")
  db, err := sql.Open("athena", "db=example")
  if err != nil {
    panic(err)
  }
  rows, err := db.Query("SELECT userid, transform(value.emails, x -> x.value) from database LIMIT 10")
  // Returns 
  // Row 1: "abc-123", ["email1@gmail.com", "email2@gmail.com"] 
  // Row 2: "def-456", ["email3@gmail.com"]

  if err != nil {
    panic(err)
  }

  for rows.Next() {
    var contact Contact
    rows.Scan(&contact.userid, &contact.emails)
    fmt.Println(contact)
  }
}

Однако я получаю эту ошибку в for l oop:

panic: unknown type `array` with value [email1@gmail.com]

Я озадачен упомянутым типом array и не могу понять ошибку. Как я могу сопоставить список сообщений электронной почты, возвращенных к фрагменту строк в структуре контактов?

1 Ответ

0 голосов
/ 23 января 2020

Athena поддерживает структурные типы данных. Например, массив структурных типов данных:

Structural types

    ARRAY < data_type >

Из полученного сообщения я предполагаю, что столбец электронной почты имеет тип ARRAY<VARCHAR>. Кроме того, segmentio/go-athena паникует по неподдерживаемым операциям, таким как Begin для транзакции (которые не поддерживаются в Афине). Чтобы прочитать данные в массиве Go, вы должны поместить в лог c. См. чтение столбцов «SELECT *» в строку [] в go или Считывание массива Postgresql непосредственно в Golang Slice для начала. Как вы можете видеть с драйвером pq, чтение массива может быть реализовано иначе, чем простое сканирование строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...