go集成gorm数据库的操作代码

 更新时间:2024年11月07日 08:53:36   作者:hlsd#  
GORM 是一个用于 Go 语言的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来与数据库进行交互,GORM 支持多种数据库,并且提供了丰富的功能,如自动迁移、预加载、事务管理等,文中通过代码示例讲解的非常详细,需要的朋友可以参考下

一、什么是gorm

GORM 是一个用于 Go 语言的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来与数据库进行交互。GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、SQL Server 等,并且提供了丰富的功能,如自动迁移、预加载、事务管理等。

二、特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

三、安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

四、集成

func InitMySql() *gorm.DB {
 
	// 数据源设置
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN: viper.GetString("db.mysql.dsn"),
	}),
		&gorm.Config{NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "t_", 
			SingularTable: true,
		},
			Logger:                                   logger.Default.LogMode(logger.Info), 
			DisableForeignKeyConstraintWhenMigrating: true,                                
		},
	)
	if err != nil {
		panic(err)
	}
 
	sqlDb, _ := db.DB()
	sqlDb.SetMaxOpenConns(viper.GetInt("db.mysql.maxOpenConns"))
	sqlDb.SetMaxIdleConns(viper.GetInt("db.mysql.maxIdleConns"))
	sqlDb.SetConnMaxLifetime(time.Hour)
 
	return db
}

五、CRUD 接口

创建记录

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
 
result := db.Create(&user) // 通过数据的指针来创建
 
user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

查询

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
 
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
 
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
 
result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error or nil
 
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

更新

当使用 Update 更新单列时,需要有一些条件,否则将会引起ErrMissingWhereClause 错误。 当使用 Model 方法,并且它有主键值时,主键将会被用于构建条件,例如:

// 根据条件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
 
// User 的 ID 是 `111`
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
 
// 根据条件和 model 的值进行更新
db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;

删除

删除一条记录时,删除对象需要指定主键,例如:

// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
 
// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";

原生 SQL

db.Exec("DROP TABLE users")
db.Exec("UPDATE orders SET shipped_at = ? WHERE id IN ?", time.Now(), []int64{1, 2, 3})
 
// Exec with SQL Expression
db.Exec("UPDATE users SET money = ? WHERE name = ?", gorm.Expr("money * ? + ?", 10000, 1), "jinzhu")

到此这篇关于go集成gorm数据库操作代码的文章就介绍到这了,更多相关go集成gorm数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • goland把go项目打包进docker镜像的全过程记录

    goland把go项目打包进docker镜像的全过程记录

    golang编译的应用是不需要依赖其他运行环境的,下面这篇文章主要给大家介绍了关于goland把go项目打包进docker镜像的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • golang操作rocketmq的示例代码

    golang操作rocketmq的示例代码

    这篇文章主要介绍了golang操作rocketmq的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • go处理线程之间的交互示例代码

    go处理线程之间的交互示例代码

    Go语言以goroutine为核心实现并发编程,其中线程间交互主要通过Channels、WaitGroup、Mutex和Select实现,Channels提供goroutine间的数据传递,本文给大家介绍go处理线程之间的交互示例代码,感兴趣的朋友一起看看吧
    2024-10-10
  • minikube部署Go应用小结

    minikube部署Go应用小结

    本文详细介绍了在VMCentos7环境下使用Minikube和Kubernetes部署Go应用的步骤,包括安装Minikube和Kubectl、配置Docker镜像源和私有仓库、部署项目以及解决启动过程中的常见问题,感兴趣的朋友一起看看吧
    2025-03-03
  • GoLang socket网络编程传输数据包时进行长度校验的方法

    GoLang socket网络编程传输数据包时进行长度校验的方法

    在GoLang socket网络编程中,为了确保数据交互的稳定性和安全性,通常会通过传输数据的长度进行校验,发送端首先发送数据长度,然后发送数据本体,接收端则根据接收到的数据长度和数据本体进行比较,以此来确认数据是否传输成功
    2024-11-11
  • 在golang中使用Sync.WaitGroup解决等待的问题

    在golang中使用Sync.WaitGroup解决等待的问题

    这篇文章主要介绍了在golang中使用Sync.WaitGroup解决等待的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言模拟while语句实现无限循环的方法

    Go语言模拟while语句实现无限循环的方法

    这篇文章主要介绍了Go语言模拟while语句实现无限循环的方法,实例分析了for语句模拟while语句的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • go install和go get的区别实例详解

    go install和go get的区别实例详解

    go install是Golang用来编译和安装自定义package的工具,下面这篇文章主要给大家介绍了关于go install和go get区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • golang解析json数据的4种方法总结

    golang解析json数据的4种方法总结

    在日常工作中每一名开发者,不管是前端还是后端,都经常使用 JSON,下面这篇文章主要给大家介绍了关于golang解析json数据的4种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论