gorm的常见坑

详情请查阅gorm文档

模型定义

通常在定义一个gorm的数据库表模型时,会内嵌gorm.Model类型。

type User struct {
	gorm.Model		// use gorm.Model
	Name string
}

// Model a basic GoLang struct which includes the following fields: ID, CreatedAt, UpdatedAt, DeletedAt
// It may be embedded into your model or you may build your own model without it
//    type User struct {
//      gorm.Model
//    }
type Model struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt DeletedAt `gorm:"index"`
}

这个结构体中包含了一些基本的定义,如ID、事件发生时间等信息。

当然我们也可以选择不内嵌该结构,自己去声明这些字段。

type User struct {
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}

上述代码片段中,需要注意sql.Nullxxx类型的字段。Stringsql.NullString类型在处理空值时(如更新、查询等)会有很大不同,所以这里是有坑的,在涉及到空值处理时需要十分的小心。

关于模型定义的详情参照:https://gorm.io/zh_CN/docs/models.html#embedded_struct

连接数据库

这里主要注意的有以下几点。

连接语句的一些参数的使用,如编码格式,解析,安全性等参数。

dsn := "user:passwd@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

一些数据库连接自定义配置,如日志,字段长度、精度等。

// 配置日志格式
newLogger := logger.New(
    log.New(os.Stdout, "\r\n", log.Lshortfile),
    logger.Config{
        SlowThreshold: time.Second,
        LogLevel:      logger.Info,
        Colorful:      true,
    },
)

// 进行数据库的 配置和连接
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: newLogger,
    DefaultStringSize: 256,
   	...
})

CRUD

Create

  • 通常情况下gorm会自动为我们创建记录的主键,虽然我们并没有显示的指定主键。
  • 如果数据量过大,可以使用分批创建,分批大小可以在创建连接时进行配置。
  • 在创建的节点可以使用Hook执行特定操作。
  • 除了使用结构体、列表进行创建,还可以使用Map创建记录,此外还支持原生的SQL语句

Retrieve

  • 需要注意嵌套查询,使用PreloadJoins进行预加载或是链接,或者滞后填充嵌套数据。
  • 可以使用SQL语句、结构体字段和map处理查询条件。
  • 关于高级的用法请查看文档。

Update

  • 注意零值字段的更新,有坑。

Delete

  • 注意软删除和永久删除。

一些通用的设定

  • 在一些关键的事务操作节点上可以使用Hooks自动执行操作。

多表关联操作

  • 注意多表关联的模型关系。
  • 关于外键的设置,自定义和重写外键。
  • 嵌套查询的预加载和表连接。
  • 删除。
自认为是幻象波普星的来客
Built with Hugo
主题 StackJimmy 设计