返回介绍

使用 NULL 值

发布于 2024-08-15 13:01:57 字数 3408 浏览 0 评论 0 收藏 0

可空列不太招人喜欢, 它会造成大量丑陋的代码. 如果可以, 应该尽量避开它们. 如果不行, 你需要使用 database/sql 包中特殊的类型或自定义类型来处理.

可空的类型包括: 布尔, 字符串, 整型, 浮点型等. 以下是使用方法:

for rows.Next() {
    var s sql.NullString
    err := rows.Scan(&s)
    // check err
    if s.Valid {
       // use s.String
    } else {
       // NULL value
    }
}

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

  1. 没有 sql.NullUint64sql.NullYourFavoriteType 类型, 你需要自己定义.
  2. 可空性可能很棘手, 而且在未来某个时刻可能会出现问题. 当你误以为某些东西不是空的时候, 你的程序将会崩溃, 或许很少, 以至于你在交付之前都没能捕获异常.
  3. Go 的一个好处是它为每个变量提供了一个有用的默认零值. 但这不是使得可空类型更安全的有效方式.

如果你想自定义类型来处理空值, 可以参考 sql.NullString 的设计.

如果你无法避免在数据库中使用空值, 有一个大多数数据库都支持的方法, 即 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)
    // ..
    // If `other_field` was NULL, `otherField` is now an empty string. This works with other data types as well.
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文