我在Postgres中有一个带有UUID字段类型的表格,这个字段必须是唯一的,但可以为空。
如果遇到这样的表格和模型:
CREATE TABLE IF NOT EXISTS asdf(
id bigserial primary key,
name varchar(255) NOT NULL,
key uuid unique,
created_at timestamptz,
updated_at timestamptz
);
并且go模型定义为
type Asdf struct {
ID uint64 `json:"id" gorm:"type:uuid;column:id"`
Name string `json:"name" gorm:"column:name"`
Key uuid.UUID `json:"key" gorm:"column:key"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
}
result := db.Connect().Create(asdf.Asdf {ID:123, Name:"This is the name"})
并将以下SQL查询语句输出到终端。
INSERT INTO "asdf" ("id","name","key","created_at","updated_at")
VALUES('123','This is the name','00000000-0000-0000-0000-000000000000','2022-04-27 03:41:49.338','2022-04-27 03:41:49.338')
在将模型插入数据库时,它使用 00000000-0000-0000-0000-000000000000
作为 key
值,而不是 NULL。
我还发现对于字符串类型,它插入了一个空字符串 ''
,而不是 NULL。
如何使gorm插入NULL而不是零值/空字符串?
Key *uuid.UUID
。您显然还需要调整您的Go代码。 - LeGECsql
接口,因此您也可以尝试定义一个自定义类型,该类型实现sql.Scanner
(在 sql -> go 转换中将null
转换为""
)和driver.Valuer
(来自sql/driver
包,在 go -> sql 转换中将""
转换为null
)。不过我还没有测试它,所以您需要自己尝试。 - LeGEC