为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
波斯汪 2022-12-05 17:21:22
我在 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 而不是零/空字符串作为值?
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

尝试将您的字段类型更改为指针类型:


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。

不过我还没有测试过,所以你必须自己尝试一下。


查看完整回答
反对 回复 2022-12-05
?
白衣非少年

TA贡献1155条经验 获得超0个赞

问题中未指定您使用的包。如果你使用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


查看完整回答
反对 回复 2022-12-05
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信