我有以下代码:
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)
不起作用?
答案 0 :(得分:2)
您应该让exists
与您从数据库中检索到的值的类型相同或兼容。
由于您选择了id
列,因此我假设它是一个integer
,因此,您应该声明存在var exists int
如下。但是,如果要查找表中是否存在行,通常使用以下形式的查询:
SELECT EXISTS(SELECT 1 FROM source WHERE mgmt= $1)
(至少在postgres中,我不确定您使用的是什么数据库)
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
检查错误,如果确实收到错误,则不会是那个错误。