Функция сканирования по ссылке или по значению - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть следующий код:

statement := `SELECT id from source where mgmt = $1 `
var exists string
errUnique := dr.db.QueryRow(statement, mgmt).Scan(exists)
if errUnique != nil && errUnique != sql.ErrNoRows {
    return errUnique
}

Приведенный выше код работает для меня.Однако не должен ли мой .Scan(&exists) иметь ссылку?Это не работает.С другой стороны, когда я изменяюсь, существует значение bool, как показано здесь var exists bool, .Scan(&exists) внезапно работает.Почему строки exists и .Scan(&exists) не работают?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы должны иметь exists того же типа или совместимого типа, с типом значения, которое вы извлекаете из базы данных.

Поскольку вы выбираете столбец id,Я буду считать, что это integer, и поэтому вы должны объявить о существовании следующим образом var exists int.Однако, если вы хотите выяснить, присутствует ли строка в таблице или нет, вы обычно используете запрос вида:

SELECT EXISTS(SELECT 1 FROM source WHERE mgmt= $1)

(по крайней мере, в postgres, я не уверен, чтоиспользуемую вами базу данных)

EXISTS:

Аргумент EXISTS - это произвольный оператор SELECT или подзапрос.Подзапрос оценивается, чтобы определить, возвращает ли он какие-либо строки.Если он возвращает хотя бы одну строку, результат EXISTS равен «true»;если подзапрос не возвращает строк, результатом EXISTS будет «false».

Тогда ваш код Go будет выглядеть примерно так:

query := `SELECT EXISTS(SELECT 1 FROM source WHERE mgmt = $1)`

var exists bool
if err := dr.db.QueryRow(query, mgmt).Scan(&exists); err != nil {
    return err
}

if exists {
    // already taken
} else {
    // unique
}

Также обратите внимание, что с EXISTSвсегда возвращает логическое значение, вам не нужно сравнивать ошибку с sql.ErrNoRows, если вы получите ошибку, она не будет такой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...