可为空的列很烦人,并且会导致很多难看的代码。如果可以,请避免使用它们。如果不可,那么您将需要使用 database/sql
包中的特殊类型来处理它们,或定义自己的类型。
可空的类型有布尔值、字符串、整数和浮点数。它们的使用方法如下:
for rows.Next() {
var s sql.NullString
err := rows.Scan(&s)
// 检查 err
if s.Valid {
// 使用 s.String
} else {
// NULL 值
}
}
可空类型的限制,以及在需要更有说服力的情况下避免可空列的原因:
- 没有
sql.NullUint64
或sql.NullYourFavoriteType
。您需要为此定义您自己的类型。 - 可空性是很棘手的,而且不是面向未来的。如果您认为某些东西不会是空的,但是您错了,那么您的程序将会崩溃,可能很少出现,以至于您无法在发布错误之前捕获它们。
- 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` 现在为空字符串。这也适用于其他数据类型。
}
转自:https://learnku.com/docs/go-database-sql/nulls/9481
最后编辑: kuteng 文档更新时间: 2021-11-19 09:19 作者:kuteng