按参考或按值扫描功能

时间:2019-02-18 17:06:01

标签: go

我有以下代码:

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 :(得分:2)

您应该让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检查错误,如果确实收到错误,则不会是那个错误。