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 main

import (
	"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      int64
		Name    string
		Salt    string
		Age     int
		Passwd  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 []User
	users = 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 Cols
	affected, 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 Omit
	affected, 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 string
	engine.Table(&user).Where("id=1001").Cols("name").Get(&name)
	fmt.Println(name)
	
	//查询多条记录
	var users []User
	engine.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   rows
	user3 := 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)是指由一系列操作组成的逻辑工作单元,这些操作要么全部成功执行,要么全部回滚(撤销),以确保数据库的一致性和完整性。文章来源地址https://www.toymoban.com/news/detail-833538.html

	
	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库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 适用于快速开发应用的Golang二次框架

    适用于快速开发应用的Golang二次框架。 GinSkeleton 项目简介 1.这是一个基于go语言gin框架的web项目骨架,专注于前后端分离的业务场景,其目的主要在于将web项目主线逻辑梳理清晰,最基础的东西封装完善,开发者更多关注属于自己的的业务即可。 2.本项目骨架封装了以tb_users表

    2024年02月07日
    浏览(34)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(36)
  • 100天精通Golang(基础入门篇)——第23天:错误处理的艺术: Go语言实战指南

    🌷🍁 博主猫头虎🐅🐾 带您进入 Golang 语言的新世界✨✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通

    2024年02月07日
    浏览(54)
  • golang 通用的 grpc http 基础开发框架

    golang 通用的 grpc http 基础开发框架 仓库地址: https://github.com/webws/go-moda 仓库一直在更新,欢迎大家吐槽和指点 transport: 集成 http(echo、gin)和 grpc。 tracing: openTelemetry 实现微务链路追踪 pprof: 分析性能 config: 通用的配置文件读取模块,支持 toml、yaml 和 json 格式。 logger: 日志系统

    2024年02月10日
    浏览(27)
  • Go语言项目后端使用gin框架接收前端发送的三种格式数据(form-data,json,Params)

    使用gin框架的BindJSON方法,将前端的json格式数据将后端的结构体相绑定,从而获取到前端所发送的数据,并返回给前端 1.将前端发送过来的数据全部返回 2.将前端发送过来的json格式数据选择性返回   使用gin框架的PostForm方法,从而获取到前端form格式的参数 使用gin框架中的

    2024年02月01日
    浏览(36)
  • 【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言入门指南:基础语法和常用特性解析 | 青训营 本文主要梳理自 第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲) 。同时

    2024年02月13日
    浏览(43)
  • Fisco Bcos区块链五(后端区块链应用开发框架及流程)

    在IntelliJ IDE中创建一个gradle项目,勾选Gradle和Java,并输入工程名 asset-app 。 注意:该项目的源码可以用以下方法获得并参考。(此步骤为非必须步骤) 注解 如果因为网络问题导致长时间无法下载,请尝试将 199.232.28.133 raw.githubusercontent.com 追加到 /etc/hosts 中,或者请尝试 cu

    2024年02月14日
    浏览(44)
  • 【Go 基础篇】Go语言字符类型:解析字符的本质与应用

    字符类型是计算机编程中用于表示文本和字符的数据类型,是构建字符串的基本单位。在Go语言(Golang)中,字符类型具有独特的特点和表示方式,包括Unicode编码、字符字面值以及字符操作。本篇博客将深入探讨Go语言中的字符类型,介绍字符的编码方式、字符字面值的表示

    2024年02月13日
    浏览(29)
  • golang iris框架 + linux后端运行

    打包应用 开启服务 关闭后台 杀死进程 通过 ps -ef|grep main 找到应用出现 找到应用的( PID(一般是第一个数字) )

    2024年02月07日
    浏览(49)
  • PandaX : Go语言企业级 IoT 物联网平台快速开发框架

    PandaX  是一个基于前后端分离架构开发的开源企业级物联网平台低代码开发基座,后端系统采用 Go 语言和前端基于 VUE3 开发,支持设备接入、设备管控,规则链引擎,云组态,可视化大屏,报表设计器,表单设计器,代码生成器等功能,帮助你快速建立企业 IoT 物联网平台相

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包