设计模式之database sql与gorm实践笔记 | 青训营笔记

95 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

一、理解 database/sql

1.1 database/sql 的基本用法

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
)

type user struct {
   id   int64
   name string
}

func main() {
   db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/community")
   rows, err := db.Query("select id, username from user where id = ?", 1)
   if err != nil {
      fmt.Println(err)
      panic(err)
   }
   defer rows.Close()

   var users []user
   for rows.Next() {
      var u user
      err := rows.Scan(&u.id, &u.name)
      if err != nil {
         fmt.Println(err)
      }
      users = append(users, u)
   }

   if rows.Err() != nil {
      fmt.Println(err)
      panic(err)
   }
   for i, u := range users {
      fmt.Println(i)
      fmt.Println(u)
   }
}

先 import driver 实现 使用driver+DBS初始化 DB连接

执行一条SQL语句,通过rows取回返回的数据,处理完毕要释放连接,如果没有关闭连接,容易造成系统卡死,或者数据库连接失败,要非常注意

接下来是 数据和错误处理

if rows.Err() != nil {
   fmt.Println(err)
   panic(err)
}

这个错误处理也很关键,也需要注意

1.2 设计原理

未命名文件.png

极简的设计思路,并且用到了池化技术,把那些昂贵的资源放在一个池子里面,并且还用到了探活机制

在database/sql和数据库之间的连接接口有Driver接口,和Connector接口,并且在Connecor接口中,还可以定义 一个config的结构体来对数据库连接池进行配置。

database/sql和设计库之间的操作接口的一般形式就是在连接池中拿到一个连接或者新建一个连接,执行玩相应的操作之后把连接放回到连接池中。

应用程序和database/sql直接按的操作接口是rows,rows定义了一些常规的操作,可以让应用程序拿到它想要的数据。

二、GORM 基础使用

基础用法

package main

import (
   "database/sql"
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
   "time"
)

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

func main() {
   db, err := gorm.Open(mysql.Open("user:password@tcp(127.0.0.1:3306)/community"))
   if err != nil {
      panic(err)
   }
   //操作数据库
   db.AutoMigrate(&Name{})
   //db.Migrator().CreateTable(&Name{})

   var users = []Name{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}

   db.Create(users)

   for _, user := range users {
      fmt.Println(user.ID)
   }
}

上述代码就是gorm的基础用法,包括了数据库的连接和数据库表的自动创建和自动刷新表并返回每个数据的主键,这些gorm都是支持的。并且gorm支持各种crud方法用起来很方便。并且gorm还支持级联各种级联操作。

GORM 的设计原理

其实GORM就是在应用程序和database/sql之间的操作之间,为了方便应用程序操作而设置的。

    • sql是怎么生成的
    • 插件是怎么工作的
    • ConnPoo是什么
    • Dialector

3.1 GORM 最佳实践

  1. 数据序列化与sql表示
  2. 批量数据操作
  3. 代码复用、分库分表、Sharding
  4. 混沌工程/压测
  5. Logger/Trace
  6. Migrator
  7. Gen代码生成/Raw Sql
  8. 安全