在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
}
答案 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;
并在代码中捕获响应。