yxtiblin
@yxtiblin

Go как прочитать и записать массив из postgres?

Написал некоторый код чтобы записывать/читать массивы в postgres. Проблема оказалась в том, что функция Scan не подходит для того чтобы читать массив и по итогу выдает такую ошибку
sql: Scan error on column index 5, name "liked_tracks": unsupported Scan, storing driver.Value type string into type *[]models.Track

Сам пример кода:
type User struct {
	Id              int64   `json:"id"              gorm:"primary_key"`
	Name            string  `json:"username"        gorm:"type:varchar(25);unique;not null"`
	Password        string  `json:"password"        gorm:"not null"`
	ImagePath       string  `json:"image_path"`
	Friends         []int64 `json:"friends"         gorm:"type:integer[]"`
	Liked_tracks    []Track `json:"liked_tracks"    gorm:"type:json[]"`
	Liked_playlists []int64 `json:"liked_playlists" gorm:"type:integer[]"`
}

type Track struct {
	Id        int64  `json:"id"         gorm:"primary_key"`
	Name      string `json:"name"       gorm:"type:varchar(50);not null"`
	Author    string `json:"author"     gorm:"type:varchar(50);not null"`
	TrackPath string `json:"track_path" gorm:"not null"`
	ImagePath string `json:"image_path"`
}

func (t Track) Value() (driver.Value, error) {
	return json.Marshal(t)
}

func (t *Track) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("type assertion to []byte failed")
	}
	return json.Unmarshal(b, &t)
}

С подобным сталкиваюсь впервые и не знаю как реализовать функцию по другому.
  • Вопрос задан
  • 606 просмотров
Решения вопроса 1
yxtiblin
@yxtiblin Автор вопроса
Решил проблему с помощью библиотеки pq
import (
	"database/sql/driver"
	"encoding/json"
	"errors"

	"github.com/lib/pq"
)

type Track struct {
	Id        int64  `json:"id"         gorm:"primary_key"`
	Name      string `json:"name"       gorm:"type:varchar(50);not null"`
	Author    string `json:"author"     gorm:"type:varchar(50);not null"`
	TrackPath string `json:"track_path" gorm:"not null"`
	ImagePath string `json:"image_path"`
}

func (t Track) Value() (driver.Value, error) {
	return json.Marshal(t)
}

func (t *Track) Scan(src interface{}) error {
	b, ok := src.([]byte)
	if !ok {
		return errors.New("type assertion to []byte failed")
	}
	return json.Unmarshal(b, &t)
}

type TrackArray []Track

func (t *TrackArray) Scan(src interface{}) error {
	return pq.GenericArray{t}.Scan(src)
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы