GO框架基础 (三)、xorm库

2024-02-21 06:20
文章标签 基础 go 框架 xorm

本文主要是介绍GO框架基础 (三)、xorm库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

xorm介绍

官网:https://xorm.io/
git文档:https://github.com/go-xorm/xorm
xorm 是一个 Go 语言的 ORM(对象关系映射)库,它提供了一种简单、高效的方式来将 Go 语言中的结构体与数据库表进行映射,并提供了丰富的功能来进行数据库操作。

以下是 xorm 的一些特点和功能:

  1. 支持多种数据库: xorm 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle 等。

  2. 灵活的映射规则: 通过标签(tag)或者方法可以自定义结构体字段和数据库表字段之间的映射关系。

  3. 自动建表: xorm 支持根据结构体自动创建数据库表,也可以根据数据库表自动生成相应的结构体。

  4. 链式操作: xorm 支持链式操作,可以方便地构建复杂的 SQL 查询。

  5. 事务支持: xorm 支持事务操作,可以确保多个数据库操作的原子性。

  6. 缓存支持: xorm 提供了缓存机制,可以提高数据库查询的性能。

  7. 监听器: xorm 支持事件监听器,可以监听数据库操作的各个阶段,并执行相应的逻辑。

  8. SQL 日志: xorm 提供了 SQL 日志功能,可以记录数据库操作的 SQL 语句和执行时间,方便调试和性能优化。

  9. 适用于 Web 开发: xorm 与 Beego、Gin 等常用的 Go Web 框架集成良好,可以方便地在 Web 应用中使用。

  10. 社区活跃: xorm 是一个开源项目,拥有活跃的开发者社区,提供了丰富的文档和示例。

使用 xorm 可以帮助开发人员简化数据库操作,并提高开发效率。它提供了许多便利的功能和灵活的配置选项,适用于各种规模的项目。

GO安装xorm

	go get xorm.io/xorm

xorm连接数据库

使用xorm.NewEngine(“mysql”, dbStr)连接数据库

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)// 准备链接参数信息
var (userName  string = "root"passWord  string = "12345678"ipAddress string = "127.0.0.1"port      string = "3306"dbName    string = "xorm_test"charset   string = "utf8mb4"
)func main() {dbStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", userName,passWord,ipAddress,port,dbName,charset)engine, err := xorm.NewEngine("mysql", dbStr)if err != nil {fmt.Println(err)}
}

xorm同步结构体致数据表

通过engine.Sync将结构体生成表,执行后会在xorm_test中生成一张User表

func main() {dbStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", userName,passWord,ipAddress,port,dbName,charset)engine, err := xorm.NewEngine("mysql", dbStr)if err != nil {fmt.Println(err)}type User struct {Id      int64Name    stringSalt    stringAge     intPasswd  string    `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}//	数据同步,将结构体同步至数据库err1 := engine.Sync(new(User))if err1 != nil {fmt.Println(err1)}
}

exec

exec函数可以搭配所有sql语句来执行相应操作。

	//exec  函数+sql语句 ? 为占位符engine.Exec("update user set age = ? where id = ?", 10, 1003)

插入数据

通过Insert来向数据库中单个或批量添加数据。

	affected, err := engine.Insert(&user)// INSERT INTO struct () values ()affected, err := engine.Insert(&user1, &user2)// INSERT INTO struct1 () values ()// INSERT INTO struct2 () values ()affected, err := engine.Insert(&users)// INSERT INTO struct () values (),(),()affected, err := engine.Insert(&user1, &users)// INSERT INTO struct1 () values ()// INSERT INTO struct2 () values (),(),()
	//数据插入user1 := User{Id: 1000, Name: "xiaohong", Age: 18, Passwd: "123456"}user2 := User{Id: 1001, Name: "xiaoming", Age: 18, Passwd: "123456"}n, _ := engine.Insert(&user1, &user2)fmt.Println(n)if n >= 1 {fmt.Println("插入成功")}//批量插入  切片var users []Userusers = append(users, User{Id: 1002, Name: "xiaolan", Age: 18, Passwd: "123456"})users = append(users, User{Id: 1003, Name: "xiaohei", Age: 18, Passwd: "123456"})n1, _ := engine.Insert(&users)fmt.Println(n1)if n1 >= 1 {fmt.Println("插入成功")}

更新与删除数据

	affected, err := engine.ID(1).Update(&user)// UPDATE user SET ... Where id = ?affected, err := engine.Update(&user, &User{Name:name})// UPDATE user SET ... Where name = ?var ids = []int64{1, 2, 3}affected, err := engine.In("id", ids).Update(&user)// UPDATE user SET ... Where id IN (?, ?, ?)// force update indicated columns by Colsaffected, err := engine.ID(1).Cols("age").Update(&User{Name:name, Age: 12})// UPDATE user SET age = ?, updated=? Where id = ?// force NOT update indicated columns by Omitaffected, err := engine.ID(1).Omit("name").Update(&User{Name:name, Age: 12})// UPDATE user SET age = ?, updated=? Where id = ?affected, err := engine.ID(1).AllCols().Update(&user)// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ?affected, err := engine.Where(...).Delete(&user)// DELETE FROM user Where ...affected, err := engine.ID(2).Delete(&user)// DELETE FROM user Where id = ?
	upUser := User{Name: "lyh11"}upn, _ := engine.ID(1000).Update(upUser)fmt.Println(upn)if upn >= 1 {fmt.Println("更新成功")}deln, _ := engine.ID(1002).Delete(&User{})fmt.Println(deln)if deln >= 1 {fmt.Println("删除成功")}

条件查询与遍历输出

	//Query  字节切片  字符串切片  map切片  直接写sql语句进行查询res, _ := engine.Query("select * from user")fmt.Println(res)res1, _ := engine.QueryString("select * from user")fmt.Println(res1)res2, _ := engine.QueryInterface("select * from user")fmt.Println(res2)//Get 没条件,查询到数据库里的第一条数据user := User{}engine.Get(&user)fmt.Println(user)//指定条件查询  加条件user1 := User{Name: "xiaohong"}engine.Where("name=?", user1.Name).Desc("id").Get(&user1)fmt.Println(user1)//获取指定的值 将name拿出来单独赋值var name stringengine.Table(&user).Where("id=1001").Cols("name").Get(&name)fmt.Println(name)//查询多条记录var users []Userengine.Where("passwd=123456").And("age=18").Limit(10, 0).Find(&users)fmt.Println(1, users)//count 获取条数user2 := User{Name: "xiaoming"}total, _ := engine.Count(&user2)fmt.Println(total)//遍历 Iterate   rowsuser3 := User{Name: "xiaohong"}engine.Iterate(&user3, func(idx int, bean interface{}) error {fmt.Println(1, bean)fmt.Println(2, bean.(*User))return nil})rows, _ := engine.Rows(&user3)defer rows.Close()userBean := new(User)for rows.Next() {rows.Scan(userBean)fmt.Println(33, userBean)}

事务处理

在数据库操作中,事务(Transaction)是指由一系列操作组成的逻辑工作单元,这些操作要么全部成功执行,要么全部回滚(撤销),以确保数据库的一致性和完整性。

	session := engine.NewSession()defer session.Close()session.Begin()// 通过panic将恐慌抛出,并做回滚处理defer func() {err := recover()fmt.Println(err)if err != nil {session.Rollback()} else {session.Commit()}}()user4 := User{Id: 1009, Name: "xiaoming1", Passwd: "123456"}if _, err := session.Insert(&user4); err != nil {panic(err)}user5 := User{Name: "xiaohaung"}if _, err := session.Where("id=1000").Update(&user5); err != nil {panic(err)}if _, err := session.Where("name='aaa'").Delete(&User{}); err != nil {panic(err)}

这篇关于GO框架基础 (三)、xorm库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730820

相关文章

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte