8. 处理 NULL

未匹配的标注

可为空的列很烦人,并且会导致很多难看的代码。如果可以,请避免使用它们。如果不可,那么您将需要使用 database/sql 包中的特殊类型来处理它们,或定义自己的类型。

可空的类型有布尔值、字符串、整数和浮点数。它们的使用方法如下:

for rows.Next() {
    var s sql.NullString
    err := rows.Scan(&s)
    // 检查 err
    if s.Valid {
       // 使用 s.String
    } else {
       // NULL 值
    }
}

可空类型的限制,以及在需要更有说服力的情况下避免可空列的原因:

  1. 没有 sql.NullUint64sql.NullYourFavoriteType。您需要为此定义您自己的类型。
  2. 可空性是很棘手的,而且不是面向未来的。如果您认为某些东西不会是空的,但是您错了,那么您的程序将会崩溃,可能很少出现,以至于您无法在发布错误之前捕获它们。
  3. Go 的优点之一是每个变量都有一个有用的默认零值。这不是可为空的事情的工作方式。

如果您需要定义自己的类型来处理 NULL,您可以复制 sql.NullString 的设计来实现这一点。

如果您无法避免在数据库中包含 NULL 值,那么还有另一种方法可以解决大多数数据库系统支持的问题,那就是 COALESCE()。以下内容可能是您可以使用的内容,而无需引入大量的 sql.Null* 字段类型。

rows, err := db.Query(`
    SELECT
        name,
        COALESCE(other_field, '') as otherField
    WHERE id = ?
`, 42)

for rows.Next() {
    err := rows.Scan(&name, &otherField)
    // ..
    // 如果 `other_field` 为 NULL,那么 `otherField` 现在为空字符串。这也适用于其他数据类型。
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~