Я получил ошибку SQLC сгенерировать с помощью соединения, массив

# #postgresql #go #sqlc

Вопрос:

Я разрабатываю сервер API с PostgreSQL, golang, sqlc.

Мой sql выглядит следующим образом

 SELECT e.*, rslt.artineve FROM events AS e, LATERAL (
    SELECT ARRAY (SELECT art_id FROM arteve WHERE arteve.eve_id = e.uid) AS artineve
) rs<
 

И sqlc generate переводит это следующим образом

 
const getAllEvents = `-- name: GetAllEvents :many
SELECT e.uid, e.name, e.intro, e.phone, e.address, e.price, e.explain, e.uri, e.images, e.start_date, e.end_date, e.time_info, e.sns, e.genre, e.longitude, e.latitude, e.live, e.created_at, rslt.artineve FROM events AS e, LATERAL (
    SELECT ARRAY (SELECT art_id FROM arteve WHERE arteve.eve_id = e.uid) AS artineve
) rslt
`

type GetAllEventsRow struct {
    Uid       int64           `json:"uid"`
    TimeInfo  string          `json:"time_info"`
    Sns       json.RawMessage `json:"sns"`
    Genre     []string        `json:"genre"`
    CreatedAt time.Time       `json:"created_at"`
    Artineve  interface{}     `json:"artineve"`
}

func (q *Queries) GetAllEvents(ctx context.Context) ([]GetAllEventsRow, error) {
    rows, err := q.db.QueryContext(ctx, getAllEvents)
    if err != nil {
        return nil, err
    }
    defer rows.Close()
    var items []GetAllEventsRow
    for rows.Next() {
        var i GetAllEventsRow
        if err := rows.Scan(
            amp;i.Uid,
            amp;i.Name,
            amp;i.Sns,
            pq.Array(amp;i.Genre),
            amp;i.CreatedAt,
            amp;i.Artineve,
        ); err != nil {
            return nil, err
        }
        items = append(items, i)
    }
    if err := rows.Close(); err != nil {
        return nil, err
    }
    if err := rows.Err(); err != nil {
        return nil, err
    }
    return items, nil
}
 

И это работает, когда я тестирую в приложении TablePlus.
Но результат с сервера API возвращает like "artineve": "ezIsMTh9" , но он должен быть похожим [11, 3, 4] .

Ответ №1:

Добавление подсказки типа решило эту проблему.

 SELECT e.*, rslt.artineve::integer[] FROM events AS e, LATERAL (
    SELECT ARRAY (SELECT art_id FROM arteve WHERE arteve.eve_id = e.uid) AS artineve
) rs<