簡體   English   中英

如何正確掃描Golang中array_agg function的結果?

[英]How to properly scan the results of the array_agg function in Golang?

在我的Golang (1.15) 應用程序中,我使用sqlx package 來處理PostgreSQL數據庫 (PostgreSQL 12.5)。

我的SQL請求有一個array_agg function 返回字符串數組或 null 如果它是空的。

我正在嘗試Scan此 SQL 請求的結果,但它會在我的程序中引發下一個錯誤:

sql:列索引 3 上的掃描錯誤,名稱“organization_ids”:不支持掃描,將 driver.Value 類型字符串存儲到類型 *[]string

代碼片段

type Channel struct {
    ChannelId           *string   `db:"channel_id" json:"channelId"`
    ChannelName         *string   `db:"channel_name" json:"channelName"`
    OrganizationsIds    *[]string `db:"organizations_ids" json:"organizationsIds"`
}

var channel Channel

row := db.QueryRow(`
    select
        channels.channel_id::text,
        channels.channel_name::text,
        array_agg(distinct channels_organizations_relationship.organization_id)::text[] organizations_ids
    from
        channels
    left join channels_organizations_relationship on
        channels.channel_id = channels_organizations_relationship.channel_id
    where
        channels.channel_id = $1
    group by
        channels.channel_id
    limit 1;`, *channelId)

if err := row.Scan(&channel.ChannelId, &channel.ChannelName, &channel.OrganizationsIds); err != nil {
    fmt.Println(err)
}

return &channel

我還嘗試將Channel結構中的OrganizationsIds字段的數據類型從github.com/lib/pq package 更改為*pg.StringArray pg.StringArray。 在這種情況下,當我Scan時,我的程序中出現以下錯誤:

sql:列索引 3 上的掃描錯誤,名稱“organizations_ids”:不支持掃描,將 driver.Value 類型字符串存儲到類型 *[]pq.StringArray

我的任務是為該列向客戶端返回字符串列表或 null/nil。

有人可以解釋如何解決這種奇怪的行為嗎?

好吧,終於我找到了我的問題的解決方案。

我注意到array_agg function 返回[null] 我稍微更改了 SQL 請求以返回null而不是[null] 我通過以下更改做到了:

array_agg(distinct channels_organizations_relationship.organization_id) filter (where channels_organizations_relationship.organization_id is not null)

在這篇文章中( Postgres 返回 [null] 而不是 [] for array_agg of join table ),您可以找到許多不同的解決方案來解決這個問題。

然后您可以使用以下解決方案之一:

1 選項

我們可以在結構中使用OrganizationsIds pq.StringArray ,然后在掃描時執行此row.Scan(..., &channel.OrganizationIds

2選項

我們可以在結構中使用OrganizationsIds []string ,然后在掃描時執行此row.Scan(..., (*pq.StringArray)(&channel.OrganizationIds))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM