跳至主要內容

Gorm教程

OrangBus大约 1 分钟

安装

"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"

viper-读取配置文件

https://github.com/spf13/viperopen in new window

go get github.com/spf13/viper

初始化

表迁移

func MigrateTable() {
	M := db.Migrator()
	if !M.HasTable(&MovieCate{}) {
		M.CreateTable(&MovieCate{})
	}
}

// 或者是
db.AutoMigrate(&MovieCate{})

时间处理

package models

import (
	"fmt"
	"time"
)

type LocalTime time.Time

func (t *LocalTime) MarshalJSON() ([]byte, error) {
	tTime := time.Time(*t)
	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}

type BaseModel struct {
	ID        uint      `gorm:"primarykey" json:"id"`
	CreatedAt LocalTime `json:"created_at"`
	UpdatedAt LocalTime `json:"updated_at"`
}

自定义表名

package models

import (
	"github.com/google/uuid"
	"gorm.io/gorm"
)

type User struct {
	BaseModel
	UUid     string `json:"uuid" gorm:"unique"`
	Name     string `json:"name" `
	Phone    string `json:"phone" `
	Password string `json:"password" `
	MerId    int64  `json:"mer_id"`
}

func (User) TableName() string {
	return "user"
}

baseModdel

表操作

查询

添加

删除

一对一

一个用户对应一个订单表

package main

import (
	"fmt"
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Username string
	Order    Order `gorm:"foreignKey:Uid"`
}

type Order struct {
	gorm.Model
	Uid   uint64
	Price float64
}

var DB *gorm.DB

func Content() {
	db, err := gorm.Open(sqlite.Open("database.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	DB = db
}

func main() {
	Content()
	DB.AutoMigrate(&User{})
	DB.AutoMigrate(&Order{})

	var user User
	DB.Preload("Order").Find(&user, 1) // 用户表关联 订单表 查询
	fmt.Println("user", user)
	fmt.Println("order", user.Order)
}

一对多

一个用户对应多个订单

package main

import (
	"fmt"
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

// 主表
type User struct {
	gorm.Model
	Username string
	Orders   []Order `gorm:"foreignKey:Uid"` // 这里是一个分片
}

type Order struct {
	gorm.Model
	Uid   uint64
	Price float64
    User User `gorm:"foreignKey:Uid"` // 指定当前表的外键即可
}

var DB *gorm.DB

func Content() {
	db, err := gorm.Open(sqlite.Open("database.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	DB = db
}

func main() {
	Content()
	DB.AutoMigrate(&User{})
	DB.AutoMigrate(&Order{})

	var user User
	DB.Preload("Orders").Find(&user, 1)
	fmt.Println("users", user)
	if len(user.Orders) > 0 {
		for _, item := range user.Orders {
			fmt.Println("order", item)
		}
	}
    
    // 查询订单列表的时候携带创建订单的用户
    
}

func GetListWithUser(page, limit int) (orderList []models.Order) {
	order := []models.Order{}
	database.DB.Preload("User").Limit(limit).Offset(page).Order("id desc").Find(&order)
	return order
}

多对多