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 中的所有内容都保持小写即可!
我正在尝试让一些旧代码通过单元测试。给我带来问题的测试在这里:
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 中的所有内容都保持小写即可!