Запрос базы данных GORM по ее атрибуту pq.StringArray - PullRequest
1 голос
/ 27 мая 2020

У меня есть следующая модель gorm.Model, и я хочу запросить мою Postgres базу данных, чтобы вернуть Confessions, которые имеют определенную категорию c в их атрибуте .Categories, но я понятия не имею, как запрашивать внутри 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+"%")
        }
    }

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Используйте <@ для массива. Вы можете запросить, используя Query функцию *sql.DB, и получить *sql.DB, используя tx.DB() в gorm

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

Или попробуйте Gorm Raw SQL, но я выиграл ' t уверен, что он будет работать правильно или нет для функций массива.

Ссылки:

  • PostgreSQL Функция массива здесь
  • Protgre SQL Использование массива в golang здесь
0 голосов
/ 28 мая 2020

Самым простым решением моей проблемы было использование команды .Where как таковой

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

Это вернет gorm.DB, чтобы я мог продолжить цепочку действий. Оператор && предназначен для проверки ПЕРЕКЛЮЧЕНИЯ элементов.

...