如何避免 0(零)int 变成 Postgres“空”值并违反“非空”约束?

Phi*_*ian 5 postgresql go sql-null

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

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

当它被解组为 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
}
Run Code Online (Sandbox Code Playgroud)

Geo*_* IV -1

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

INSERT INTO shows(
    user_id, name, description, created, modified
) VALUES(
    :user_id, :name, :created, :modified
) RETURNING id;
Run Code Online (Sandbox Code Playgroud)

并捕获代码中的响应。