Eli's Blog

1. 入门

1.1 安装

1
go get -u github.com/jinzhu/gorm

1.2 驱动

1
2
3
4
import _ "github.com/jinzhu/gorm/dialects/mysql"
import _ "github.com/jinzhu/gorm/dialects/postgres"
import _ "github.com/jinzhu/gorm/dialects/sqlite"
import _ "github.com/jinzhu/gorm/dialects/mssql"

2. 操作

2.1 表结构定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type Admin struct {
ID int64
Username string `gorm:"size:50;not null"`
Password string `gorm:"size:128"`
}

type Account struct {
gorm.Model // ID, CreatedAt, UpdatedAt, DeletedAt

Appkey string `gorm:"type:varchar(15);index:idx_appkey;not null"`
Company string `gorm:"column:company_name;size:30"`
Status int8 `gorm:"default:1"`
}

func (Admin) TableName() string {
return "tbl_admin"
}

func (Account) TableName() string {
return "tbl_account"
}

2.2 连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const (
DBUSER = "root"
DBPASS = ""
HOST = "127.0.0.1"
PORT = "3306"
DBNAME = "blog"
)

func GetConn() *gorm.DB {
connStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local&timeout=10ms",
DBUSER, DBPASS, HOST, PORT, DBNAME)
fmt.Println(connStr)

db, err := gorm.Open("mysql", connStr)
if err != nil {
log.Fatalf("mysql connect error: %v", err)
}

db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)

// 自动创建和更新表结构
if !db.HasTable("tbl_admin") {
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&Admin{})
}

if !db.HasTable("tbl_account") {
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&Account{})
}

return db
}

2.3 新增数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func Insert(db *gorm.DB) {
c := make(chan Admin)

go generateData(c)

for v := range c {
db.NewRecord(v) // 检查主键是否存在
db.Create(&v)
}
}

func generateRandomString(n int) string {
s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
bs := make([]byte, n)
for i := 0; i < n; i++ {
bs[i] = s[rand.Intn(len(s))]
}

return string(bs)
}

func md5Encrypt(s string) string {
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
}

func generateData(c chan Admin) {
for i := 0; i < 20; i++ {
name := generateRandomString(6)
pass := md5Encrypt(name + "_123456")
c <- Admin{Username: name, Password: pass}
}

close(c)
}

2.4 查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
func Select(db *gorm.DB) {
a := Admin{}
db.Select([]string{"id", "username", "password"}).Where("id = ?", 1).First(&a)
fmt.Println(a)
}

func SelectMany(db *gorm.DB) {
as := []Admin{}
db.Where("username like '%4%'").Find(&as)
for _, a := range as {
fmt.Println(a)
}
}

2.5 更新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func Update(db *gorm.DB) {
a := Admin{}
db.Where("id = ?", 1).First(&a)
a.Username = "elihe123"
a.Password = md5Encrypt("123456")
db.Save(a) // 数据必须有变化,否则无法保存

b := Admin{
ID: 30,
Username: "rania123",
Password: md5Encrypt("654321"),
}
db.Save(b) // id不存在时,自动创建

c := Admin{ID: 10}
db.Model(&c).Update("username", "eli")
}

2.6 删除数据

1
2
3
4
func Delete(db *gorm.DB) {
a := Admin{ID: 30}
db.Delete(&a)
}

3. 钩子函数(callbacks)

  • 创建: BeforeSave, BeforeCreate, AfterCreate, AfterSave
  • 更新: BeforeSave, BeforeUpdate, AfterUpdate, AfterSave
  • 删除: BeforeDelete, AfterDelete
  • 查询: AfterFind
1
2
3
4
5
6
7
8
9
func (Account) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("CreatedAt", time.Now().Unix())
return nil
}

func (Account) BeforeUpdate(scope *gorm.Scope) error {
scope.SetColumn("UpdatedAt", time.Now().Unix())
return nil
}

 上一页