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

Go and postgres reinterpreting integer as nil type

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

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,这个returns:

'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 的模式 table 它正在插入:

CREATE TABLE devices(
ID INTEGER,
Guid VARCHAR,
Name VARCHAR
);

我试过使用 sql.NillInt64 类型,但这似乎无法解决问题。感觉就像 gorp、go 或 postgres 在那里将整数解释为 nil。作为最后一个数据点,这都是在各种 Docker 容器中 运行ning,但我认为这个问题与 Docker 无关。有什么见解吗?

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

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

现在只需将 postgres 中的所有内容都保持小写即可!