forked from go-chi/chi
-
Notifications
You must be signed in to change notification settings - Fork 0
gorm
遇见王斌 edited this page Oct 5, 2024
·
8 revisions
当前 x1 项目中使用
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)
}
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[]
部署集例子
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
}
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)
}