我曾经使用 Google Code 中的代码。 更新到 master 中的最新代码后,我收到了以前没有收到的以下错误:
sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string
我会进行更多调查,但也许在此期间您已经对此有所了解?
旧代码为NULL
值返回了一个空的[]byte
,这使得无法区分NULL
值和空字符串。
有关详细信息,请参阅问题 #20。
由于这个目标,错误由database/sql
包返回:
* Be flexible with type conversions, but be paranoid about silent
truncation or other loss of precision.
如果列可能包含 NULL 值,您必须使用http://golang.org/pkg/database/sql/#NullString
谢谢,有道理。
我几乎想要一种配置库的方法来给我旧的行为。 在某些方面,Go 的“默认零值”很有意义,并消除了大量样板代码。 我有点想把它放在一个地方,可配置的,而不是在我的代码中到处散布它,我可能会遇到 NULL。 使用 NullString 等在代码方面非常丑陋。
NULL 只是一场噩梦,我想摆脱 NULL。 我明确地将 _my_ 表中的每一列定义为 NOT NULL,但偶尔像 SHOW PROCESSLIST 这样的命令会在其中包含 NULL,而我的代码并不关心; 我想要一个空字符串。 我将使用 NullString,并忽略它的 .Valid 属性并只获取它的 .String,如果该列为 NULL,它将为空。
能够告诉驱动程序将 NULL 转换为类型的零值(或者实际上,我猜它真正做的是跳过将列扫描到变量中)将减少很多困难和容易出错(而不是 -面向未来)为我工作。 或者,如果我不想要所有样板代码,我可以保证列 a) 确实不可为空 b) 将永远保持这种状态。
我还希望 database/sql 包遵循 Go 的“默认零值”策略。 如果需要,您仍然可以区分 Null* 类型,但不幸的是,设计决定是这样做出的。 也许他们在 Go2 中更改了它(为此我提供了 +1)。
目前我没有计划为此添加驱动程序选项。 与 PostgreSQL 相比,该协议已经一团糟(我认为更有效)。 我不想让司机更加混乱。
现在,每个扫描的字符串多一个str = nullStr.Value
是较小的邪恶。
我试图添加一个选项来将NULL
值归零: https :
但在驱动程序级别上这是不可能的。 如果您将零值设置为[]byte{}
您可以将其扫描到string
和[]byte
但不能扫描到数字类型。 如果您将其设置为0
,您可以将其扫描为数字类型,但您会得到“0”作为string
/ []byte
。
我不太明白驱动程序实际上是如何扫描的,但不是
将 dest[i] 设置为某个东西,如果驱动程序只是跳过设置怎么办
目的地[我]?
dest
基本上是一个[]interface{}
切片。 interface{}
的默认值为nil
。 所以跳过设置dest[i]
与设置dest[i]=nil
结果相同
我更新了分支。 如果你愿意,你可以自己尝试一下。
这看起来很适合我的需求,下次更新时我会尝试一下
驱动程序的副本。
我想到了另一种解决方法:
只需使用 []byte 而不是字符串。 转换 nil-[]byte 会产生一个空字符串:
string([]byte("")) // => ""
string([]byte(nil)) // => ""
也许保持这个开放,也许对例子有好处
解决方法: https :
由于这个页面在搜索结果中仍然显示相当高,我的两分钱:
您也可以在imo,问题实际所在的部分解决它:数据库抽象级别。 您可以通过执行以下操作来解决此问题:
SELECT
id,
COALESCE(name, '') as name
FROM users
这样,如果name
包含 NULL,则在扫描时将其替换为空字符串。 Coalesce 得到广泛支持。
我不明白当字符串为空时为什么会抛出异常
这个例子对我有用
您可以传递一个字符串指针来处理它,如下所示:
var txt *string
checkErr(result.Scan(&txt))
// do something with type *string
这对我来说可以。
除了@Dynom伟大的评论,我觉得还是可以值得一提的是, sql.NullString
类型来得心应手,如果你想的目标,以解决这一问题Scan
(这是我所看到的是转到侧面数据库抽象级别)。
此外,它还保留了区分nil
值和空字符串的能力。
对于空字符串,如果要显示像 json 这样的信息,则需要开发人员创建地图 vo。 这里没问题,是一种很好且正确的方法,但并非对所有情况都有意义,然后可能是语言限制的额外工作。
最有用的评论
由于这个页面在搜索结果中仍然显示相当高,我的两分钱:
您也可以在imo,问题实际所在的部分解决它:数据库抽象级别。 您可以通过执行以下操作来解决此问题:
这样,如果
name
包含 NULL,则在扫描时将其替换为空字符串。 Coalesce 得到广泛支持。