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

How to insert NULL value to UUID instead of zeros

我在 postgres 中有一个 table,其 UUID 字段类型必须是唯一的但可以为 null

table 和这样的模特

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 而不是 zeros/empty 字符串作为值?

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

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 代码(例如:检查是否 record.Key != nil,访问 *record.Key 而不是 record.Key,等等......)


我认为 gorm 也支持常规 sql 接口,因此您也可以尝试定义一个自定义类型来实现 :

  • sql.Scanner 在 sql 上将 null 变成 "" -> 进行转换,
  • driver.Valuer(来自 sql/driver 包)将 "" 转换为 null -> sql 转换。

虽然我没有测试过,所以你必须自己尝试。