我正在尝试使用一些旧代码来通过其单元测试。给我带来问题的测试在这里:
func Test1(t *testing.T){
//Code
testDevice := Device{
ID: 1,
Guid: "C6",
Name: "test device",
}
err := Dbmap.Insert(&testDevice)
So(err, ShouldBeNil)
//More code
}
当我运行go test
时,会返回:
'sql: Scan error on column index 0: converting driver.Value type <nil> ("<nil>") to a int64: invalid syntax'
这很奇怪,因为我传给它1,一个整数。设备结构在此处定义:
type Device struct {
ID int64 `db:"id"`
Guid string
Name string
}
这是它插入的Postgres表的架构:
CREATE TABLE devices(
ID INTEGER,
Guid VARCHAR,
Name VARCHAR
);
我尝试使用sql.NillInt64
类型,但似乎无法解决问题。感觉就像某种程度上,gorp,go或者postgres将整数解释为零。作为最终数据点,这些都在各种Docker容器中运行,但我不认为这个问题与Docker有关。任何见解?
答案 0 :(得分:0)
答案归结为Go和postgres之间的区分大小写交互。彼得的评论基本上回答了这个问题,但任何读这篇文章的人都可能需要更多解释。 Go只导出大写的对象,而postgres默认将列名称解释为小写。所以我需要大写映射到小写列的结构(除非我想引用每个单个大写列名称)。要做到这一点,在你的结构中使用标签,基本上告诉Go把它称为一件事,而postgres称之为另一个。你的新结构应如下所示:
type Device struct {
ID int64 `db:"id"`
Guid string `db:"guid"`
Name string `db:"name"`
}
现在只需将所有内容保存在postgres中,您就可以了!