Skip to content

shockerli/gormer

Repository files navigation

gormer

PkgGoDev

Useful scopes and tools for GORM V1

Chunk

db, err := gorm.Open(
    "mysql",
    "root:root@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local&timeout=30s")
if err != nil {
    return
}

var data []YourObject
db = db.Table("your_object_table_name").Select("id, name").Where("bz_id = ?", 999)

gormer.ChunkByIDMaxMin(50, db, &data, func() {
    for _, item := range data {
        print(item.ID, ", ")
    }
    println("\n")
}, nil)

Pager

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

type QueryUserListParams struct {
    gormer.PageParam
    Name string `json:"name"`
}

type QueryUserListResult struct {
    gormer.PageResult
    List []User
}

var params = QueryUserListParams{}
var data = QueryUserListResult{}
data.PageParam = params.PageParam

db = db.Table("your_object_table_name").Where("bz_id = ?", 999)

data.Scan(db, &data.List)

Order

type QueryUserListParams struct {
    gormer.OrderParam
    Name string `json:"name"`
}
var params = QueryUserListParams{}

db = db.Table("your_object_table_name").Scopes(params.Order())

sql-gen

auto generate the helper functions for database field

  • Install
go install github.com/shockerli/gormer/sql-gen
  • Source code

source code of app/field/fields.go

//go:generate sql-gen
package field

import "app/enum"

//go:sql-gen -f=ALL
type IDX struct {
    ID int64 `json:"id" gorm:"column:id"`
}

//go:sql-gen -f=EQ,IN
type DispatchTypeX struct {
    DispatchType enum.DispatchType `json:"dispatch_type" sql:"column:dispatch_type"`
}
  • Generate code

execute command: go generate ./...

generate codes to app/field/fields_gen.go:

// Code generated by github.com/shockerli/gormer/sql-gen DO NOT EDIT

// Package field SQL build helper functions for field
package field

import (
  "github.com/jinzhu/gorm"
  "github.com/shockerli/gormer/tmp/enum"
)

// ****************** ID ****************** //

// Eq WHERE id = ?
func (i IDX) Eq(v ...int64) func(db *gorm.DB) *gorm.DB {
    if len(v) == 0 {
        v = append(v, i.ID)
    }
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("id = ?", v[0])
    }
}

// Gt WHERE id > ?
func (i IDX) Gt(v ...int64) func(db *gorm.DB) *gorm.DB {
    if len(v) == 0 {
        v = append(v, i.ID)
    }
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("id > ?", v[0])
    }
}

// ****************** DispatchType ****************** //

// Eq WHERE dispatch_type = ?
func (i DispatchTypeX) Eq(v ...enum.DispatchType) func(db *gorm.DB) *gorm.DB {
    if len(v) == 0 {
        v = append(v, i.DispatchType)
    }
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("dispatch_type = ?", v[0])
    }
}
  • Use code

use Scope() build where condition

type ObjectItem struct {
    field.IDX
    field.DispatchTypeX
}

func (ObjectItem) TableName() string {
    return "object_item_01"
}

func main() {
    m := ObjectItem{}
    err := DB().Model(m).Scopes(m.IDX.Eq(1146)).Take(&m).Error
    s, _ := json.Marshal(m)
    spew.Dump(err, m)
    println(string(s), "\n")

    json.Unmarshal([]byte(`{"id":999}`), &m)
    println(m.DispatchType)
}

enum-gen

parse the enum const and comment, generate helper functions

  • Install
go install github.com/shockerli/gormer/enum-gen
  • Source code

source code of app/enum/pay_type.go

//go:generate enum-gen

package enum

type PayType uint8

const (
    PayTypeQQ     PayType = 1 // QQ支付
    PayTypeWeiXin PayType = 2 // 微信支付
    PayTypeAlipay PayType = 3 // 支付宝
)
  • Generate code

execute command: go generate ./...

generate codes to app/enum/pay_type_gen.go:

// Code generated by github.com/shockerli/gormer/enum-gen; DO NOT EDIT

// Package enum enum helpers
package enum

// ************ PayType ************ //

var payTypeMap = map[PayType]string{
    PayTypeQQ:     "QQ支付",
    PayTypeWeiXin: "微信支付",
    PayTypeAlipay: "支付宝",
}

// Check whether the type is exist
func (t PayType) Check() bool {
    _, ok := PayTypeMap()[t]
    return ok
}

// Desc return the desc of type
func (t PayType) Desc() string {
    return PayTypeMap()[t]
}

// PayTypeMap return all of the types
func PayTypeMap() map[PayType]string {
    return payTypeMap
}

Releases

No releases published

Packages

No packages published

Languages