gorm

  1. 文档地址:
    https://gorm.io/zh_CN/docs/

  2. 用法:

    1. 安装:
      go get gorm.io/gorm

    2. 使用:

       package main
      
       import (
           "fmt"
           "gorm.io/driver/mysql"
           "gorm.io/gorm"
       )
      
       type User struct {
           gorm.Model
           Name string `gorm:"column:name;type:varchar(20) NOT NULL;default:'';comment:姓名"`
       }
      
       func (User) TableName() string {
           return "user"
       }
       func main() {
           // 连接(单个数据库)
           dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
           db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
           //// 连接(数据库集群)
           //dsn1 := "root:123456@tcp(10.0.0.12:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
           //dsn2 := "root:123456@tcp(10.0.0.13:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
           //db, _ := gorm.Open(mysql.Open(dsn1), &gorm.Config{})
           //db.Use(dbresolver.Register(dbresolver.Config{
           //    Sources:  []gorm.Dialector{mysql.Open(dsn1), mysql.Open(dsn2)},
           //    Replicas: []gorm.Dialector{mysql.Open(dsn1), mysql.Open(dsn2)},
           //    Policy:   dbresolver.RandomPolicy{},
           //}))
           // 创建表
           db.AutoMigrate(&User{})
           // 增
           user := User{Name: "A"}
           db.Create(&user)
           // 删
           db.Where("name = ?", "A").Delete(&User{})
           // 改
           db.Model(&User{}).Where("name = ?", "C").Updates(User{
               Name: "D",
           })
           // 查
           var res User
           db.Where("name = ?", "D").First(&res)
           fmt.Println(res)
           // 事务
           tx := db.Begin()
           r1 := db.Create(&User{Name: "E"})
           r2 := db.Create(&User{Name: "F"})
           if r1.RowsAffected > 0 && r2.RowsAffected > 0 {
               tx.Commit()
           } else {
               tx.Rollback()
           }
       }

gen

  1. 文档地址:
    https://gorm.io/zh_CN/gen/

  2. 用法一,使用 gorm 生成数据表(先生成模型,后建表):

    1. 安装:
      go get gorm.io/gen

    2. 使用:

      1. 目录结构:

         |—— test/   // 根目录
         ****|—— config/
         ********|—— config.go  // 配置文件
         ****|—— model/
         ********|—— model.go  // 数据库模型文件
         ****|—— generate.go  // 生成gen代码文件
         ****|—— main.go  // 入口文件
         ****|—— go.mod  // go module文件
      2. go.mod:

        module test
      3. config.go:

         package config
        
         import (
             "gorm.io/driver/mysql"
             "gorm.io/gorm"
         )
        
         func NewDB() *gorm.DB {
             dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
             db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
             return db
         }
      4. model.go:

         package model
        
         import (
             "gorm.io/gen"
             "gorm.io/gorm"
         )
        
         type Querier interface {
             // SELECT * FROM @@table WHERE name = @name
             FilterWithName(name string) ([]gen.T, error)
         }
        
         type User struct {
             gorm.Model
             Name string `gorm:"column:name"`
         }
        
         func (u User) TableName() string {
             return "user"
         }
      5. generate.go:

         package main
        
         import (
             "gorm.io/gen"
             "test/config"
             "test/model"
         )
        
         func main() {
             g := gen.NewGenerator(gen.Config{
                 OutPath: "./query",  // 生成gen文件的目录
                 Mode:    gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode
             })
             db := config.NewDB()
             g.UseDB(db)
        
             g.ApplyBasic(model.User{})
        
             g.ApplyInterface(func(model.Querier) {}, model.User{})
        
             g.Execute()
         }
      6. main.go:

         package main
        
         import (
             "fmt"
             "test/config"
             "test/model"
             "test/query"
         )
        
         func main() {
             db := config.NewDB()
             //db.AutoMigrate(&model.User{})  // 迁移到数据库
             userDao := query.Use(db).User
             // 增
             err := userDao.Create(&model.User{
                 Name: "lee",
             })
             fmt.Println("增:", err)
             // 删
             resultDelete, err := userDao.Where(userDao.ID.Eq(1)).Delete()
             fmt.Println("删:", resultDelete, err)
             // 改
             resultUpdate, err := userDao.Where(userDao.ID.Eq(2)).Update(userDao.Name, "zhangsan")
             fmt.Println("改:", resultUpdate, err)
             // 查(原生)
             resultSelectRaw, err := userDao.Where(userDao.ID.Eq(3)).First()
             fmt.Println("查(原生):", resultSelectRaw, err)
             // 查(自定义)
             resultSelectDiy, err := userDao.FilterWithName("zhangsan")
             fmt.Println("查(自定义):", resultSelectDiy, err)
             // 事务
             query.Use(db).Transaction(func(tx *query.Query) error {
                 if err := tx.User.Create(&model.User{
                     Name: "lee",
                 }); err != nil {
                     return err
                 }
                 if _, err := tx.User.Where(tx.User.ID.Eq(2)).Delete(); err != nil {
                     return err
                 }
                 if _, err := tx.User.Where(tx.User.ID.Eq(3)).Update(tx.User.Name, "zhangsan"); err != nil {
                     return err
                 }
                 return nil
             })
         }
    3. 运行:

      1. 生成gen代码:
        go run generate.go
      2. 运行:
        go run main.go
  3. (*推荐)用法二,使用 gentool 生成数据模型(先建表,后生成模型):

    1. 安装:

      # 安装 gen
      go get gorm.io/gen
      # 安装 gentool
      go install gorm.io/gen/tools/gentool@latest
    2. 使用:

      1. 目录结构:

         |—— test/   // 根目录
         ****|—— config/
         ********|—— config.go  // 配置文件
         ****|—— config.yaml  // gentool 配置文件
         ****|—— main.go  // 入口文件
         ****|—— go.mod  // go module文件
      2. go.mod:

        module test
      3. config.go:

         package config
        
         import (
             "gorm.io/driver/mysql"
             "gorm.io/gorm"
         )
        
         func NewDB() *gorm.DB {
             dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
             db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
             return db
         }
      4. config.yaml:

         version: "0.1"
         database:
           dsn: "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
           db: "mysql"
           #tables: ""
           outPath:  "./query"
           outFile:  ""
           withUnitTest: false
           modelPkgName: ""
           fieldNullable: false
           fieldWithIndexTag: true
           fieldWithTypeTag: true
      5. main.go:

         package main
        
         import (
             "context"
             "fmt"
             "test/config"
             "test/model"
             "test/query"
         )
        
         func main() {
             ctx := context.Background()
             db := config.NewDB()
             user := query.Use(db).User
             userDao := user.WithContext(ctx)
             // 增
             err := userDao.Create(&model.User{
                 Name: "lee",
             })
             fmt.Println("增:", err)
             // 删
             resultDelete, err := userDao.Where(user.ID.Eq(1)).Delete()
             fmt.Println("删:", resultDelete, err)
             // 改
             resultUpdate, err := userDao.Where(user.ID.Eq(2)).Update(user.Name, "zhangsan")
             fmt.Println("改:", resultUpdate, err)
             // 查
             resultSelectRaw, err := userDao.Where(user.ID.Eq(3)).First()
             fmt.Println("查(原生):", resultSelectRaw, err)
             // 事务
             query.Use(db).Transaction(func(tx *query.Query) error {
                 txWithCtx := tx.User.WithContext(ctx)
                 if err := txWithCtx.Create(&model.User{
                     Name: "lee",
                 }); err != nil {
                     return err
                 }
                 if _, err := txWithCtx.Where(tx.User.ID.Eq(2)).Delete(); err != nil {
                     return err
                 }
                 if _, err := txWithCtx.Where(tx.User.ID.Eq(3)).Update(tx.User.Name, "zhangsan"); err != nil {
                     return err
                 }
                 return nil
             })
         }
    3. 运行:

      1. 生成gen代码:
        gentool -c config.yaml
      2. 运行:
        go run main.go
文档更新时间: 2024-04-19 15:11   作者:lee