go语言mysql的gorm基本用法

发布时间:2024年01月12日

GORM是使用Go语言开发的友好的ORM库。

1.1.1. 安装

    go get -u github.com/jinzhu/gorm

    go get -u gorm.io/gorm

通用数据库接口sql.DB

*gorm.DB连接获取通用数据库接口*sql.DB

    // 获取通用数据库对象`*sql.DB`以使用其函数
    db.DB()

    // Ping
    db.DB().Ping()

1.1.2. 连接池

    db.DB().SetMaxIdleConns(10)
    db.DB().SetMaxOpenConns(100)

1.1.3. 复合主键

将多个字段设置为主键以启用复合主键

    type Product struct {
        ID           string `gorm:"primary_key"`
        LanguageCode string `gorm:"primary_key"`
    }

1.1.4. 日志

Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误

    // 启用Logger,显示详细日志
    db.LogMode(true)

    // 禁用日志记录器,不显示任何日志
    db.LogMode(false)

    // 调试单个操作,显示此操作的详细日志
    db.Debug().Where("name = ?", "jinzhu").First(&User{})

1.1.5. 自定义日志

参考GORM的默认记录器如何自定义它https://github.com/jinzhu/gorm/blob/master/logger.go

    db.SetLogger(gorm.Logger{revel.TRACE})
    db.SetLogger(log.New(os.Stdout, "\r\n", 0))

1.1.6. 架构

Gorm使用可链接的API,*gorm.DB是链的桥梁,对于每个链API,它将创建一个新的关系。

    db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")

    // 创建新关系
    db = db.Where("name = ?", "jinzhu")

    // 过滤更多
    if SomeCondition {
        db = db.Where("age = ?", 20)
    } else {
        db = db.Where("age = ?", 30)
    }
    if YetAnotherCondition {
        db = db.Where("active = ?", 1)
    }

当我们开始执行任何操作时,GORM将基于当前的*gorm.DB创建一个新的*gorm.Scope实例

    // 执行查询操作
    db.First(&user)

并且基于当前操作的类型,它将调用注册的creating,updating,querying,deleting或row_querying回调来运行操作。

基本用法示例:

package main

import (
	"fmt"

	_ "github.com/jinzhu/gorm/dialects/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 用户信息
type User struct {
	ID     uint
	Name   string
	Gender int
	Age    int
}

func CreateUsers(db *gorm.DB) error {
	// 再唠叨一下,事务一旦开始,你就应该使用 tx 处理数据
	tx := db.Begin()
	defer func() {
	  if r := recover(); r != nil {
		tx.Rollback()
	  }
	}()
  
	if err := tx.Error; err != nil {
	  return err
	}
  
	if err := tx.Create(&User{8, "枯藤", 1, 21}).Error; err != nil {
	   tx.Rollback()
	   return err
	}
  
	if err := tx.Create(&User{8, "枯藤", 1, 21}).Error; err != nil {
	   tx.Rollback()
	   return err
	}
  
	return tx.Commit().Error
  }

func main() {

	dsn := "root:root@tcp(127.0.0.1:3306)/beego?charset=utf8mb4"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		fmt.Println(err)
		panic(err)
	}

	// u1 := User{8, "枯藤", 1, 21}
	// u2 := User{9, "topgoer.com", 0, 22}
	// fmt.Println(u1)
	// // 创建记录
	// db.Create(&u1)
	// db.Create(&u2)

	// 查询
	var u = new(User)
	db.First(u)
	fmt.Printf("%#v\n", u)

	var uu User
	db.Find(&uu, "age=?", 22)
	fmt.Printf("%#v\n", uu)

	// 查询多个
	result := map[string]interface{}{}
	db.Model(&User{}).First(&result, "id = ?", 1)
	fmt.Println(result)

	var results []map[string]interface{}
	db.Table("users").Find(&results)
	fmt.Println(results)

	// 更新
	// db.Model(&u).Update("age", 31)
	// // 删除
	// db.Delete(&u)

	//开始事务
	CreateUsers(db)


	var user *User
	if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
		fmt.Println(err)
		// 错误处理...
	}

	// // 如果有多个错误发生,用`GetErrors`获取所有的错误,它返回`[]error`
	// db.First(&user).Limit(10).Find(&users).GetErrors()

	// // 检查是否返回RecordNotFound错误
	// db.Where("name = ?", "hello world").First(&user).RecordNotFound()

	// if db.Model(&user).Related(&credit_card).RecordNotFound() {
	//     // 没有信用卡被发现处理...
	// }
}

文章来源:https://blog.csdn.net/nbv12589/article/details/135508753
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。