postgresql 在Golangs Gorm中如何使用UUID?

brtdzjyr  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(7)|浏览(260)

我有以下型号...

type User struct {
    ID        string  `sql:"type:uuid;primary_key;default:uuid_generate_v4()"`
    FirstName string `form:"first_name" json:"first_name,omitempty"`
    LastName  string `form:"last_name" json:"last_name,omitempty"`
    Password  string `form:"password" json:"password" bindind:"required"`
    Email     string `gorm:"type:varchar(110);unique_index" form:"email" json:"email,omitempty" binding:"required"`
    Location  string `form:"location" json:"location,omitempty"`
    Avatar    string `form:"avatar" json:"avatar,omitempty"`
    BgImg     string `form:"bg_img" json:"bg_img,omitempty"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt time.Time
}

我已经尝试了几种不同的方法,但这种方法抛出(pq: relation "users" does not exist)。我没有相关的模型,它实际上只是一个模型。
我试过用...

func (user *User) BeforeCreate(scope *gorm.Scope) error {
    scope.SetColumn("ID", uuid.NewV4())
    return nil
}

沿着一个uuid lib,但也没有运气。

vyswwuz2

vyswwuz21#

原来我试图将UUID存储为错误的类型,我正在做...

func (user *User) BeforeCreate(scope *gorm.Scope) error {
    scope.SetColumn("ID", uuid.NewV4())
    return nil
}

在需要的时候...

func (user *User) BeforeCreate(scope *gorm.Scope) error {
    scope.SetColumn("ID", uuid.NewV4().String())
    return nil
}
p5fdfcr1

p5fdfcr12#

对于postgresql,下面是我所做的:

  • go get github.com/google/uuid
  • 使用uuid.UUID(来自“github.com/google/uuid“)作为类型,

例如

ID       uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
  • 为postgres数据库添加uuid-ossp扩展名,

例如

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  • 然后,当您调用DB的Create()方法时,uuid将自动生成。

更新:页码14+ gen_random_uuid()

  • (如Doron Segal的注解中所提到的)*

PG 14具有内建函数x1E0 F1 x,以生成UUIDv4,例如:

创建表:

创建表uuid_test(uid文本默认gen_random_uuid());

插入一行:

插入uuid_test(uid)值(默认值);
然后自动生成uid列。
类似的,在go中,我认为可以使用函数作为默认值,例如:
身份证号uuid.UUID gorm:"type:uuid;default:gen_random_uuid()"

顺便说一句gen_random_uuid()功能现在只支持uuidv4,要使用其他版本,您还需要uuid-ossp扩展。

rryofs0p

rryofs0p3#

为此,您将需要gormgo.uuid

go get github.com/jinzhu/gorm

go get github.com/satori/go.uuid

尝试创建自己的模型基础模型来代替gorm.Model,如下所示:

type Base struct {
 ID         string     `sql:"type:uuid;primary_key;default:uuid_generate_v4()"`
 CreatedAt  time.Time  `json:"created_at"`
 UpdatedAt  time.Time  `json:"updated_at"`
 DeletedAt  *time.Time `sql:"index" json:"deleted_at"`
}

然后,在创建任何记录之前,使用名为的方法填充此字段,如下所示:

func (base *Base) BeforeCreate(scope *gorm.Scope) error {
 id, err := uuid.NewV4()
 if err != nil {
   return err
 }
 return scope.SetColumn("ID", uuid.String())
}

因此,对于您的特定情况,您将:

type User struct {
    Base
    FirstName string `form:"first_name" json:"first_name,omitempty"`
    LastName  string `form:"last_name" json:"last_name,omitempty"`
    Password  string `form:"password" json:"password" bindind:"required"`
    Email     string `gorm:"type:varchar(110);unique_index" form:"email" json:"email,omitempty" binding:"required"`
    Location  string `form:"location" json:"location,omitempty"`
    Avatar    string `form:"avatar" json:"avatar,omitempty"`
    BgImg     string `form:"bg_img" json:"bg_img,omitempty"`
}

有关这方面的更多详细信息,请参阅here

vzgqcmou

vzgqcmou4#

这是我为Gorm v1.21设计的解决方案
第一个

备注:

1.对于Google UUID包,方法uuid.New()uuid.NewString()使用UUID版本4。这在文档(http://pkg.go.dev/github.com/google/uuid)中没有明确说明,但通过查看源代码,您可以看到这些是uuid.NewRandom()(声明为UUID版本4)周围的 Package 器。
1.虽然有些人推荐Satori UUID包(https://github.com/satori/go.uuid),但基准测试显示,它的性能比Google UUID包(https://gist.github.com/mattes/69a4ab7027b9e8ee952b5843e7ca6955)低3.3倍

dzjeubhm

dzjeubhm5#

错误(pq: relation "users" does not exist)通常表示,tableusers在数据库中不存在,与两个模型之间的关系无关。
所以基本上,你首先需要在数据库中创建表(或自动迁移数据库按照@Apin的建议).并尝试重新运行相同的代码.

b1uwtaje

b1uwtaje6#

这些都不适合我使用gorm v1.21的情况,这里是我的解决方案。注意,我使用的是satori/go.uuid库来生成UUID,但是google库的代码几乎是相同的。

type UUIDBaseModel struct {
    ID        uuid.UUID       `gorm:"primary_key" json:"id"`
    CreatedAt time.Time  `json:"created_at"`
    UpdatedAt time.Time  `json:"updated_at"`
    DeletedAt *time.Time `sql:"index" json:"deleted_at"`
}

func (base *UUIDBaseModel) BeforeCreate(tx *gorm.DB) error {
    uuid := uuid.NewV4().String()
    tx.Statement.SetColumn("ID", uuid)
    return nil
}
cdmah0mi

cdmah0mi7#

现在我使用Gorm 2.0,这工作:
第一个

相关问题