如何将 NULL 值插入 UUID 而不是零

我在 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 而不是零/空字符串作为值?


波斯汪
浏览 114回答 2
2回答

慕慕森

尝试将您的字段类型更改为指针类型: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"`}你显然也必须调整你的 go 代码(例如:检查 if record.Key != nil, access *record.Keyinstead ofrecord.Key等等......)我认为 gorm 也尊重常规的 sql 接口,所以你也可以尝试定义一个实现的自定义类型:sql.Scanner变成on sql -> go conversions null,""driver.Valuer(从sql/driver包中)转到""on nullgo -> sql conversions。不过我还没有测试过,所以你必须自己尝试一下。

白衣非少年

问题中未指定您使用的包。如果你使用satori/go.uuid,你可以使用NullUUID 类型:type Asdf struct {    ID          uint64         `json:"id" gorm:"type:uuid;column:id"`    Name        string         `json:"name" gorm:"column:name"`    NullableKey uuid.NullUUID `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"`}要设置一个值:key := uuid.NullUUID{    Value: id,  // of type uuid.UUID    Valid: true}要保存 null,只需保存零值即可。&方法都已定义Scan。Value
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go