@deep_orange

Golang gorm запрос логического значения у базы данных, не поле таблицы, это возможно?

Привет. Использую GORM для работы с базой данных Postgres. В консоли psql я могу просто сделать запрос (существует ли в таблице items колонка origin с таким-то значением):
SELECT EXISTS( SELECT 1 FROM items WHERE origin = 'http://example.com/path' );
и получить ответ:
?column?
----------
 t
(1 row)

Сам GORM при этом предоставляет возможность выполнить SQL запрос, но как получить это значение никак не могу понять. Т.к. все примеры приведённые для использования опираются на имя колонки (столбца) в базе данных - а здесь получается, что никакой колонки нет и `f` или `t` ни к чему не привязаны. Есть вариант поступить в обход Gorm и использовать database/sql - что в принципе не приближает к цели. Насколько я понял - для получения значения нужно выполнить Scan( &VarOfType ), что неприемлемо (или я не понимаю до конца магии). Разумеется я могу просто запросить данные из таблицы, но они то мне не нужны - я просто хочу проверить существуют ли они или нет.
Ссылки:
gorm ( github | godoc )
database/sql на godoc
драйвер postgresql

udp
Один из вариантов предложенный @sim3x работает прекрасно, жаль что он удалил ответ
var thd bool
x := mygormdb.Raw(`SELECT EXISTS( 
   SELECT 1 FROM items WHERE origin = 'http://www.infokam.su/n17724.html' ) 
as isfieldexists;`).Row()
x.Scan(&thd)
fmt.Println("Result:", thd)
  • Вопрос задан
  • 5286 просмотров
Решения вопроса 1
Tyranron
@Tyranron
На чистом database/sql:
r, err := db.Query("SELECT 1 FROM items WHERE origin='http://example.com/path' LIMIT 1")
if err != nil {
    // Oops!
}
thisTableReallyHasThatRow := r.Next()
r.Close()


То же самое можно провернуть и на gorm'е с помощью raw sql, или с помощью RecordNotFound() сделать примерно так:
thisTableReallyHasThatRow := !db.Find(&Item{}, "origin = ?", "http://example.com/path").RecordNotFound()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@melonnik
func isExist(vlan int) bool {
    var exists bool
    query := fmt.Sprintf("SELECT exists (%s)", "SELECT 1 FROM computers WHERE vlan=$1")
    err := db.QueryRow(query, vlan).Scan(&exists)
       if err != nil {
           // err
      }
    return exists
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы