如何将 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 转换。
虽然我没有测试过,所以你必须自己尝试。
我在 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 转换。
虽然我没有测试过,所以你必须自己尝试。