如何避免0(零)int转换为Postgres的“空”值并违反“非空”约束?

时间:2019-04-14 19:24:35

标签: postgresql go sql-null

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

  

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

0被解组为int值时,它看起来像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
}

2 个答案:

答案 0 :(得分:1)

虽然go-pg并不立即显而易见,但是您可以使用struct标签sql:",notnull"来显示Go空值(""0[]等。)是允许的,不应视为SQL NULL

您可以在Features list中看到它。

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

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

答案 1 :(得分:0)

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

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

并在代码中捕获响应。