【问题标题】:Querying GORM database by its pq.StringArray attribute通过其 pq.StringArray 属性查询 GORM 数据库
【发布时间】:2020-05-27 16:24:41
【问题描述】:

我有以下 gorm.Model,我想查询我的 Postgres 数据库以返回在其 .Categories 属性中具有特定类别的 Confessions,但我不知道如何在 pq.StringArray 中查询。有解决办法吗?

type Confession struct {
    gorm.Model
    User       string         `json:"User"`
    Title      string         `json:"Title"`
    Body       string         `json:"Body"`
    Mood       string         `json:"Mood"`
    Categories pq.StringArray `gorm:"type:varchar(64)[]" json:"Categories"`
}

这是我尝试查询的方式,但使用 LIKE 运算符会引发错误。

if categories != nil {
        for _, cat := range categories {
            tx = tx.Where("Categories LIKE ?", "%"+cat+"%")
        }
    }

【问题讨论】:

  • 您可以回退到更高效、更易于理解的 SQL
  • 我建议检查medium.com/avitotech/…,它会更容易并且可能更惯用

标签: postgresql go go-gorm pq


【解决方案1】:

使用<@ 表示数组包含。您可以使用*sql.DBQuery函数查询并在gorm中使用tx.DB()获取*sql.DB

sel := "SELECT * FROM confessions WHERE $1 <@ categories"
categories := []string{"cat1", "cat2"}
rows, err := tx.DB().Query(sel, pq.Array(categories))

或尝试Gorm Raw SQL,但我不确定它是否适用于数组函数。

参考文献:

  • PostgreSQL 数组函数here
  • ProtgreSQL 数组在 golang 中的使用 here

【讨论】:

    【解决方案2】:

    解决我的问题的最简单方法是使用 .Where 命令

    tx = tx.Where("categories && ?", pq.Array(categories))
    

    这将返回一个 gorm.DB,以便我可以继续链接操作。 && 运算符用于检查 OVERLAPPING 元素。

    【讨论】:

    • 您检查了&lt;@ 中的Where() 运算符吗?可能会造成问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多