diff --git a/README.md b/README.md index 6c4faec..1eba469 100644 --- a/README.md +++ b/README.md @@ -298,6 +298,10 @@ type UserWithUUID struct { // Generate a new random UUID (version 4). userUUID := datatypes.NewUUIDv4() +// Generate a new time-ordered UUID (version 7). +// UUIDv7 is recommended for new applications as it's sortable by creation time. +userUUIDv7 := datatypes.NewUUIDv7() + user := UserWithUUID{Name: "jinzhu", UserUUID: userUUID} DB.Create(&user) // INSERT INTO `user_with_uuids` (`name`,`user_uuid`) VALUES ("jinzhu","ca95a578-816c-4812-babd-a7602b042460") diff --git a/uuid.go b/uuid.go index deafaac..5de99ca 100644 --- a/uuid.go +++ b/uuid.go @@ -22,6 +22,11 @@ func NewUUIDv4() UUID { return UUID(uuid.Must(uuid.NewRandom())) } +// NewUUIDv7 generates a UUID version 7, panics on generation failure. +func NewUUIDv7() UUID { + return UUID(uuid.Must(uuid.NewV7())) +} + // GormDataType gorm common data type. func (UUID) GormDataType() string { return "string" diff --git a/uuid_test.go b/uuid_test.go index 20d3976..3e5aed6 100644 --- a/uuid_test.go +++ b/uuid_test.go @@ -37,6 +37,12 @@ func TestUUID(t *testing.T) { }, { Name: "uuid-4", UserUUID: datatypes.NewUUIDv4(), + }, { + Name: "uuid-5", + UserUUID: datatypes.NewUUIDv7(), + }, { + Name: "uuid-6", + UserUUID: datatypes.NewUUIDv7(), }} if err := DB.Create(&users).Error; err != nil { @@ -122,6 +128,8 @@ func TestUUIDPtr(t *testing.T) { uuid2 := datatypes.NewUUIDv1() uuid3 := datatypes.NewUUIDv4() uuid4 := datatypes.NewUUIDv4() + uuid5 := datatypes.NewUUIDv7() + uuid6 := datatypes.NewUUIDv7() users := []UserWithUUIDPtr{{ Name: "uuid-1", @@ -135,6 +143,12 @@ func TestUUIDPtr(t *testing.T) { }, { Name: "uuid-4", UserUUID: &uuid4, + }, { + Name: "uuid-5", + UserUUID: &uuid5, + }, { + Name: "uuid-6", + UserUUID: &uuid6, }} if err := DB.Create(&users).Error; err != nil {