3 回答

TA貢獻1825條經驗 獲得超6個贊
首先,您應該檢查遷移是否已正確運行,這意味著在數據庫中創建了列
not null
約束。user_id, task_id, job_id, ..
其次,您必須使用指針,因為
golang
有一個概念zero value
意味著int
,float
,string
,如果您沒有分配任何值,則相應地具有bool
默認值, , 。但是如果你使用指針那么這個字段將最終將在數據庫中發送。如果對該列有約束,則會發生錯誤。0
0.0
""
false
nil
NULL
NOT NULL

TA貢獻1785條經驗 獲得超4個贊
您需要為此使用sql.NullIntxxnot null
或 int/float 指針,因為 int/float 的默認/空值為 0,這是針對數據庫的。
所以 gorm 和 DB 將允許它作為非空值傳遞。
類似地,對于string
必須使用*string
或sql.NullStting
作為默認值的類型string
是“”(空白字符串)而不是零。

TA貢獻1871條經驗 獲得超13個贊
null 只申請指針
gorm.Model包括
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
你不需要Id, CreatedAt, UpdatedAt在你的結構中聲明
如下更正您的結構:
type Task struct {
gorm.Model
UserId int `json:"user_id"`
TaskId int `json:"task_id"`
JobId int `json:"job_id"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
StartAt time.Time `json:"start_at"`
EndAt time.Time `json:"end_at"`
}
標簽和最佳實踐是由數據庫控制的,列定義為非空約束
AUTO_INCREMENT 應該在創建表時在數據庫上創建,這需要由數據庫控制,而不是由語言控制
聲明表如下:
create table tasks (
int primary key AUTO_INCREMENT,
user_id int not null,
task_id int not null,
job_id int not null,
latitude int not null,
longitude int not null,
start_at datetime,
created_at datetime,
updated_at datetime
)
祝你學習順利!
- 3 回答
- 0 關注
- 427 瀏覽
添加回答
舉報