Go和postgres将整数重新解释为nil类型

时间:2018-04-11 22:59:20

标签: postgresql go gorp

我正在尝试使用一些旧代码来通过其单元测试。给我带来问题的测试在这里:

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有关。任何见解?

1 个答案:

答案 0 :(得分:0)

答案归结为Go和postgres之间的区分大小写交互。彼得的评论基本上回答了这个问题,但任何读这篇文章的人都可能需要更多解释。 Go只导出大写的对象,而postgres默认将列名称解释为小写。所以我需要大写映射到小写列的结构(除非我想引用每个单个大写列名称)。要做到这一点,在你的结构中使用标签,基本上告诉Go把它称为一件事,而postgres称之为另一个。你的新结构应如下所示:

type Device struct {
        ID   int64 `db:"id"`
        Guid string `db:"guid"`
        Name string `db:"name"`
}

现在只需将所有内容保存在postgres中,您就可以了!