3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,您應(yīng)該檢查遷移是否已正確運(yùn)行,這意味著在數(shù)據(jù)庫(kù)中創(chuàng)建了列
not null
約束。user_id, task_id, job_id, ..
其次,您必須使用指針,因?yàn)?code>golang有一個(gè)概念
zero value
意味著int
,float
,string
,如果您沒(méi)有分配任何值,則相應(yīng)地具有bool
默認(rèn)值, , 。但是如果你使用指針那么這個(gè)字段將最終將在數(shù)據(jù)庫(kù)中發(fā)送。如果對(duì)該列有約束,則會(huì)發(fā)生錯(cuò)誤。0
0.0
""
false
nil
NULL
NOT NULL

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

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
null 只申請(qǐng)指針
gorm.Model包括
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
你不需要Id, CreatedAt, UpdatedAt在你的結(jié)構(gòu)中聲明
如下更正您的結(jié)構(gòu):
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"`
}
標(biāo)簽和最佳實(shí)踐是由數(shù)據(jù)庫(kù)控制的,列定義為非空約束
AUTO_INCREMENT 應(yīng)該在創(chuàng)建表時(shí)在數(shù)據(jù)庫(kù)上創(chuàng)建,這需要由數(shù)據(jù)庫(kù)控制,而不是由語(yǔ)言控制
聲明表如下:
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
)
祝你學(xué)習(xí)順利!
- 3 回答
- 0 關(guān)注
- 457 瀏覽
添加回答
舉報(bào)