Thanks to visit codestin.com
Credit goes to github.com

Skip to content
遇见王斌 edited this page Oct 5, 2024 · 8 revisions

GORM

当前 x1 项目中使用

1 使用

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

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

func main() {
    db, err := gorm.Open("mysql", "root:root@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
    if err!= nil{
        panic(err)
    }
    defer db.Close()

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

    u1 := UserInfo{1, "枯藤", "男", "篮球"}
    u2 := UserInfo{2, "topgoer.com", "女", "足球"}
    // 创建记录
    db.Create(&u1)
    db.Create(&u2)
    // 查询
    var u = new(UserInfo)
    db.First(u)
    fmt.Printf("%#v\n", u)
    var uu UserInfo
    db.Find(&uu, "hobby=?", "足球")
    fmt.Printf("%#v\n", uu)
    // 更新
    db.Model(&u).Update("hobby", "双色球")
    // 删除
    db.Delete(&u)
}

1.1 update

https://gorm.io/docs/update.html

// code
updateRes := session.Model(&unit).Where("status = ?", old_status).Update("status", unit.Status)

// log
NOTICE: 2022-05-16 16:56:43.93239879 MySQL appname[vm-manager] uri[vm_unit] service[mysql] req_len[109] res_len[0] errno[0] retry[0/0] cost[1.052] api[vm_unit] log_type[E_SUM] logid[3599249718] caller[MySQL] method[Exec] protocol[mysql] balance[Random] user_ip[192.168.232.21] local_ip[192.168.236.15] idc[test] remote_ip[192.168.232.21:3306] remote_idc[default] remote_host[] uniqid[] talk[1.043] connect[0.009] write[0] read[1.043] pack[0] unpack[0] req_start_time[1652691403931] talk_start_time[1652691403931] errmsg[nil] dnslookup[0] reuse[1] sql[/* {"log_id":"3599249718","xdb_comment":"1"} */ UPDATE `vm_unit` SET `status`=? WHERE status = ? AND `id` = ?] sql_args[["SERVING","NEW",1]] message[]

2 实践

2.1 直接调用 gorm

部署集例子

dao

// Dao 结构体
type DeploysetDao struct {
	BaseDbDao
}

// Dao 初始化
func NewDeploysetDao() *DeploysetDao {
	return &DeploysetDao{
		BaseDbDao: NewDbDao("vm_deployset", resource.MySQLClientUser),
	}
}

// 表结构体
type Deployset struct {
	Name         string    `json:"name"            gorm:"column:name;primaryKey"`
	Pool         string    `json:"pool"            gorm:"column:pool"`
	Zone         string    `json:"zone"            gorm:"column:zone"`
	TemplateName string    `json:"template_name"   gorm:"column:template_name"`
	ReservedNum  int       `json:"reserved_num"    gorm:"column:reserved_num"`
	UpdateTime   time.Time `json:"update_time"     gorm:"column:update_time"`
	CreateTime   time.Time `json:"create_time"     gorm:"column:create_time"`
}

// TableName 自定义表名 为 gorm 使用
func (x *Deployset) TableName() string {
	return "vm_deployset"
}

service

// Create
func CreateDeployset(ctx context.Context, params *deployset_params.CreateRequest) (*dao.Deployset, error) {
	var deployset dao.Deployset
	deployset.Name = params.Pool + "_" + params.Zone + "_" + params.Flag
	deployset.Pool = params.Pool
	deployset.Zone = params.Zone
	deployset.TemplateName = params.TemplateName
	deployset.ReservedNum = params.ReservedNum

	deployset.UpdateTime = time.Now()
	deployset.CreateTime = time.Now()

	ctx = mysql.ContextWithTableName(ctx, "vm_deployset")
	session := resource.OrmClient.WithContext(ctx)
	createRes := session.Create(&deployset)

	if createRes.Error != nil {
		return nil, createRes.Error
	}
	return &deployset, nil
}

// Delete
func DeleteDeployset(ctx context.Context, params *deployset_params.DeleteRequest) error {
	var deployset dao.Deployset

	ctx = mysql.ContextWithTableName(ctx, "vm_deployset")
	session := resource.OrmClient.WithContext(ctx)
	deleteRes := session.Where("name = ?", params.Name).Delete(&deployset)
	if deleteRes.Error != nil {
		return deleteRes.Error
	} else if deleteRes.RowsAffected != 1 {
		return errors.New("delete row fail , RowsAffected !=1 ")
	}
	return nil
}

// Modify
func ModifyDeployset(ctx context.Context, params *deployset_params.ModifyRequest) error {
	var deployset dao.Deployset
	deployset.Name = params.Name

	// https://gorm.io/zh_CN/docs/update.html
	// 根据 `struct` 更新属性,只会更新非零值的字段
	ctx = mysql.ContextWithTableName(ctx, "vm_deployset")
	session := resource.OrmClient.WithContext(ctx)
	updateRes := session.Model(&deployset).
		Where("name = ?", params.Name).
		Updates(dao.Deployset{TemplateName: params.TemplateName,
			ReservedNum: params.ReservedNum, UpdateTime: time.Now()})
	if updateRes.Error != nil {
		return updateRes.Error
	} else if updateRes.RowsAffected != 1 {
		return errors.New("update row fail , RowsAffected!=1")
	}
	return nil
}

// List
func ListDeployset(ctx context.Context, params *deployset_params.ListRequest) ([]dao.Deployset, int64, error) {
	var deploysets []dao.Deployset

	ctx = mysql.ContextWithTableName(ctx, "vm_deployset")
	session := resource.OrmClient.WithContext(ctx)
	if params.Name != "" {
		session = session.Where("name LIKE ?", "%"+params.Name+"%")
	}
	if params.Pool != "" {
		session = session.Where("pool = ?", params.Pool)
	}
	if params.Zone != "" {
		session = session.Where("Zone = ?", params.Zone)
	}
	if params.TemplateName != "" {
		session = session.Where("template_name = ?", params.TemplateName)
	}

	// 分页
	// https://gorm.io/zh_CN/docs/scopes.html
	page := params.PageIndex
	if page == 0 {
		page = 1
	}

	pageSize := params.PageSize
	switch {
	case pageSize > 100:
		pageSize = 100
	case pageSize <= 0:
		pageSize = 10
	}

	var count int64 = 0
	offset := (page - 1) * pageSize
	queryRes := session.Offset(offset).Limit(pageSize).Find(&deploysets).Offset(-1).Limit(-1).Count(&count)
	if queryRes.Error != nil {
		return nil, 0, queryRes.Error
	}
	return deploysets, count, nil
}

// Detail
func DetailDeployset(ctx context.Context, params *deployset_params.DetailRequest) (*dao.Deployset, error) {
	// 参数
	var deployset dao.Deployset

	// 获取数据
	ctx = mysql.ContextWithTableName(ctx, "vm_deployset")
	session := resource.OrmClient.WithContext(ctx)
	queryRes := session.Where("name = ?", params.Name).Find(&deployset)
	if queryRes.Error != nil {
		return nil, queryRes.Error
	} else if queryRes.RowsAffected < 1 {
		return nil, errors.New("query row fail , RowsAffected<1")
	}

	return &deployset, nil
}

2.2 gdp

interface.go

package x1resource
type OrderApplyBccResource struct {
	Id                    int       `gorm:"column:id;AUTO_INCREMENT;primary_key" json:"id"`
	OrderId               string    `gorm:"column:order_id;NOT NULL" json:"order_id"`
	Zone                  string    `gorm:"column:zone;NOT NULL" json:"zone"`
	DeploysetName         string    `gorm:"column:deployset_name;NOT NULL" json:"deployset_name"`
	Pool                  string    `gorm:"column:pool;NOT NULL" json:"pool"`
	Count                 int       `gorm:"column:count;NOT NULL" json:"count"`
	MaxInstanceMemoryInMB int       `gorm:"column:max_instance_memory_in_mb;NOT NULL" json:"max_instance_memory_in_mb"`
	CreateTime            time.Time `gorm:"column:create_time;NOT NULL" json:"create_time"`
}

func (OrderApplyBccResource) TableName() string {
	return "order_apply_bcc_resource"
}

order_apply_bcc_resource.go

package x1resource

import "context"

func OrderApplyBccResourceGetByCond(ctx context.Context, fmtCond string, vals ...interface{}) (*OrderApplyBccResource, error) {
	var orderApplyBccResource OrderApplyBccResource
	err := resource.GetOneByCond(ctx, &orderApplyBccResource, fmtCond, vals...)
	if err != nil {
		return nil, err
	}
	return &orderApplyBccResource, nil
}

func OrderApplyBccResourceGetAllByCond(ctx context.Context, fmtCond string, vals ...interface{}) ([]*OrderApplyBccResource, error) {
	var orderApplyBccResources []*OrderApplyBccResource
	err := resource.GetAllByCond(ctx, &orderApplyBccResources, fmtCond, vals...)
	if err != nil {
		return nil, err
	}
	return orderApplyBccResources, nil
}

func OrderApplyBccResourceSave(ctx context.Context, dataPtr []*OrderApplyBccResource) error {
	return resource.FullSaveAssociationsSave(ctx, dataPtr)
}

Clone this wiki locally