Bootstrap

go gorm学习笔记

基本用法

package main

import (
	"fmt"
	"strings"
	"time"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"github.com/spaolacci/murmur3"
)

// UserInfo 用户信息
type UserInfo struct {
	ID     uint
	Name   string
	Gender string
	Hobby  string
}

// 点赞表
type Like struct {
	ID        int       `gorm:"primary_key"`                            // 设置主键
	Ip        string    `gorm:"type:varchar(20);not null;index:ip_idx"` // 创建索引
	Ua        string    `gorm:"type:varchar(256);not null;"`
	Title     string    `gorm:"type:varchar(128);not null;index:title_idx"` // 创建索引
	Hash      uint64    `gorm:"unique_index:hash_idx;"`                     // 创建唯一索引
	CreatedAt time.Time // 时间类型
}

// UserInfo 用户信息
type Animal struct {
	ID   int    `gorm:"primary_key"`
	Name string `gorm:"type:varchar(256)`
}

//事务 db.Begin() 声明开启事务,结束的时候调用 tx.Commit(),异常的时候调用 tx.Rollback()
func CreateAnimals(db *gorm.DB) err {
	tx := db.Begin()
	if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
		tx.Rollback()
		return err
	}
	if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
		tx.Rollback()
		return err
	}
	tx.Commit()
	return nil
}
func main() {
	db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3308)/gotest?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()
	// 设置连接池
	db.DB().SetConnMaxIdleTime(5)
	db.DB().SetMaxOpenConns(100)

	// 自动迁移
	db.AutoMigrate(&UserInfo{})

	u1 := UserInfo{1, "枯藤", "男", "篮球"}
	u2 := UserInfo{4, "topgoer.com", "女", "足球"}
	u3 := UserInfo{3, "zzd", "男", "台球"}
	// 创建记录
	db.Create(&u1)
	db.Create(&u2)
	db.Create(&u3)
	// 查询
	var u = new(UserInfo)
	db.First(u)
	var uu UserInfo
	// where 查询, 当条件不唯一取最后一条
	db.Find(&uu, "hobby=?", "足球")
	fmt.Printf("%#v\n", uu)
	// 更新
	db.Model(&uu).Update("hobby", "子色球")
	db.Model(&uu).Updates(UserInfo{Name: "hell", Hobby: "乒乓求"})
	// 删除
	db.Delete(&u)

	// 创建表
	if !db.HasTable(&Like{}) {
		// 可以通过db.Set为表设置额外属性
		if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Like{}).Error; err != nil {
			panic(err)
		}
	}
	// 先构造已给对象,直接调用 db.Create() 就可以插入一条记录了
	var ip = "10.10.10.10"
	var ua = "haha"
	var title = "title"
	like := &Like{
		Ip:        ip,
		Ua:        ua,
		Title:     title,
		Hash:      murmur3.Sum64([]byte(strings.Join([]string{ip, ua, title}, "-"))) >> 1,
		CreatedAt: time.Now(),
	}

	if err := db.Create(like).Error; err != nil {
		return
	}
	// // 先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除
	// var hash uint64 = 7922748826473719846
	// if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil {
	// 	return
	// }
	var count int
	// db.Model选择表,Count计算 Where 条件出的数量
	err2 := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Error
	if err2 != nil {
		return
	}
	fmt.Println(count)

}

更新数据update 解决值为0时被忽略

    values := map[string]uint{
        "Status": status,
    }
    DB.Model(&User{}).Where(query, args...).Update(values)


;