4

在 Go 中,我将 JSON 解组/解码为具有 int 类型的 ID 字段的结构。然后我尝试使用 go-pg 将这个结构插入 PostgreSQL 数据库,并将 ID 列作为主键(它有一个非空约束)。第一个条目0的 ID 为 a。在 Postgres 文档中,它声明可以0作为主键的值。但是,我不断收到一条错误消息:

“错误 #23502 “数字”列中的空值违反了非空约束”。

当它被解组为 int 值时,它看起来像0变成了一个 Go“零值”。然后将其作为null值插入 Postgres。任何关于我如何能够避免这种情况的提示将不胜感激。

type Account struct {
   Number int `sql:"type:smallint, pk"`
   Name string
}

[...]

account := Account{}
err := json.NewDecoder(r.Body).Decode(&account)

[...]

insertErr := pgLayer.db.Insert(&account)
if insertErr != nil {
   log.Printf("Error while inserting new item")
   return "n/a", insertErr
}
4

2 回答 2

2

虽然这不是很明显,go-pg但您可以使用 struct 标记sql:",notnull"来显示允许使用 Go 空值(""0[])并且不应将其视为 SQL NULL

您可以在功能列表中看到它。

在您的情况下,我会将其更改为:

type Account struct {
   Number int `sql:"type:smallint,pk,notnull"`
   Name string
}
于 2019-04-15T01:23:44.010 回答
-1

我认为解决您的问题的最简单方法是使您的ID列类型化SERIAL并让 Postgres 为您处理设置和自动递增值。如果您在插入后直接需要应用程序中的值,则始终可以使用RETURNINGpsql 子句,如下所示:

INSERT INTO shows(
    user_id, name, description, created, modified
) VALUES(
    :user_id, :name, :created, :modified
) RETURNING id;

并在您的代码中捕获响应。

于 2019-04-14T22:38:46.717 回答