GO框架基础 (三)、xorm库
xorm介绍
官网:https://xorm.io/
git文档:https://github.com/go-xorm/xorm
xorm 是一个 Go 语言的 ORM(对象关系映射)库,它提供了一种简单、高效的方式来将 Go 语言中的结构体与数据库表进行映射,并提供了丰富的功能来进行数据库操作。
以下是 xorm 的一些特点和功能:
-
支持多种数据库:
xorm支持多种数据库,包括 MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle 等。 -
灵活的映射规则: 通过标签(tag)或者方法可以自定义结构体字段和数据库表字段之间的映射关系。
-
自动建表:
xorm支持根据结构体自动创建数据库表,也可以根据数据库表自动生成相应的结构体。 -
链式操作:
xorm支持链式操作,可以方便地构建复杂的 SQL 查询。 -
事务支持:
xorm支持事务操作,可以确保多个数据库操作的原子性。 -
缓存支持:
xorm提供了缓存机制,可以提高数据库查询的性能。 -
监听器:
xorm支持事件监听器,可以监听数据库操作的各个阶段,并执行相应的逻辑。 -
SQL 日志:
xorm提供了 SQL 日志功能,可以记录数据库操作的 SQL 语句和执行时间,方便调试和性能优化。 -
适用于 Web 开发:
xorm与 Beego、Gin 等常用的 Go Web 框架集成良好,可以方便地在 Web 应用中使用。 -
社区活跃:
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库
xorm介绍 官网:https://xorm.io/ git文档:https://github.com/go-xorm/xorm xorm 是一个 Go 语言的 ORM(对象关系映射)库,它提供了一种简单、高效的方式来将 Go 语言中的结构体与数据库表进行映射,并提供了…...
神经网络系列---回归问题和分类问题
文章目录 回归问题和分类问题回归问题:分类问题:多分类问题:排序问题:自定义损失函数: 回归问题和分类问题 回归问题: 回归问题是一种预测连续数值输出的任务。在这种问题中,模型的目标是根据…...
Jetpack Compose 与 Kotlin 的兼容性对应关系
点击查看:Jetpack Compose 教程 点击查看:Jetpack Compose Kotlin 的兼容性 官网 声明依赖项 如需添加 Compose Compiler 的依赖项,您必须将 Google Maven 代码库添加到项目中。如需了解详情,请参阅 Google 的 Maven 代码库。 …...
汇编反外挂
在软件保护领域,尤其是游戏保护中,反外挂是一个重要的议题。外挂通常指的是一种第三方软件,它可以修改游戏数据、操作游戏内存或提供其他作弊功能,从而给玩家带来不公平的优势。为了打击外挂,游戏开发者会采取一系列措…...
134 Linux 系统编程11 ,readlink命令,文件目录rwx权限差异,目录操作函数
一 readlink 命令 前面知道,如果a.soft是一个软链接,我们使用 cat a.soft,会直接查看这个软链接指向的文件 那么我们就是想看这个软链接是啥,可以使用 readlink a.soft 二 获取工作目录 getcwd函数 获取进程当前工作目录 (卷3,标…...
仿12306校招项目业务二(列车检索)
目录 验证数据 加载城市数据 查询列车站点信息 查询列车余票信息 构建列车返回数据 12306 项目中列车数据检索接口路径  TicketController的pageListTicketQuery。 GetMapping("/api/ticket-service/ticket/query")public Result<T…...
前端架构: 实现脚手架终端UI样式之ANSI escape code, Chalk, Ora介绍
在脚手架当中实现命令行的UI显示 1 )概述 在命令行中,如果想实现除传统的常规文本以外的内容比如想对字体进行加粗斜体下划线,包括对它改变颜色改变前景色改变后景色等等需要借助一个叫做 ANSI escape code 这样的一个概念它其实是一个标准&…...
platform(驱动层+应用层)实现终端和中断开关点灯
设备树文件添加 myplatform{compatible"hqyj,myplatform";interrupt-parent<&gpiof>;interrupts<8 0>,<7 0>,<9 0>;led1-gpio<&gpioe 10 0>;led2-gpio<&gpiof 10 0>;led3-gpio<&gpioe 8 0>;reg<0x123…...
黑马JavaWeb开发跟学(一)Web前端开发HTML、CSS基础
黑马JavaWeb开发一.Web前端开发HTML、CSS基础 引子、Web开发介绍传统路线本课程全新路线本课程适用人群课程收获一、什么是web开发二、网站的工作流程三、网站的开发模式四、网站的开发技术 前端开发基础一、前端开发二、HTML & CSS2.1 HTML快速入门2.1.1 操作第一步第二步…...
Nest.js权限管理系统开发(四)Swagger API接入
什么是swagger Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(<https://swagger.io/>)。 它的主要作用是: 1. 使得前后端分离开发更加方便,有利于团队协作 2. 接口的文档在线自动生成…...
(全注解开发)学习Spring-MVC的第三天
全注解开发 第一部分 : 1.1 消除spring-mvc.xml 这些是原来spring-mvc.xml配置文件的内容 <!--1、组件扫描, 使Controller可以被扫描到--><context:component-scan base-package"com.itheima.controller"/><!--2、非自定义的Bean, 文件上传解析器--&…...
设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?
前言 在面向对象编程中,有一条非常经典的设计原则:组合优于继承,多用组合少用继承。 为什么不推荐使用继承? 组合比继承有哪些优势? 如何判断该用组合还是继承? 为什么不推荐使用继承? 继承…...
RocketMQ生产环境常见问题分析与总结
RocketMQ生产环境常见问题分析与总结 如何保证消息不丢失 消息丢失场景 对于跨网络的节点可能会丢消息,因为MQ存盘都会先写入OS的PageCache中,然后再让OS进行异步刷盘,如果缓存中的数据未及时写入硬盘就会导致消息丢失 生产端到Broker端Brok…...
前端打包工具的发展历程、思路(grunt,gulp,webpack,vite)
现在前端发展真快,需要学的东西太多了,下面总结下前端打包的发展过程,便于区分和选择学习。 什么是前端打包 前端打包是指将多个JavaScript文件、CSS文件、图片等资源进行合并和优化处理,并输出为一个或多个文件的过程。这样做的目的是减少…...
利用Python将文件夹下多个txt文本写入到同一个excel中(每一个文件占一行)
1、 将文件夹下多个txt文本写入到同一个excel中(每一个文件占一行): # -*- coding: utf-8 -*- import os import pandas as pd# 获取文件夹中的所有txt文件 folder_path rG:\Cygwin\ txt_files [f for f in os.listdir(folder_path) if f.endswith(.t…...
通过Colab部署Google最新发布的Gemma模型
Gemma的简单介绍 Gemma 是一系列轻量级、最先进的开放式模型,采用与创建 Gemini 模型相同的研究和技术而构建。 Gemma 由 Google DeepMind 和 Google 的其他团队开发,其灵感来自 Gemini,其名称反映了拉丁语 gemma,意思是“宝石”…...
spring中@validate注解使用
在 Java 中,我们可以使用注解和 validate 实现对实体类中字段的校验。其中,注解用来定义字段的约束条件,而 validate 则用来进行实际的校验操作。 常用的校验注解包括 NotNull、NotEmpty、Size、Min、Max 等,它们可以帮助我们规定…...
停车场管理(C语言)
【题目描述】停车场管理。设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n辆车,则以后到达的车…...
探索无限:Sora与AI视频模型的技术革命 - 开创未来视觉艺术的新篇章
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…...
375FPS! 谷歌提出MaskConver“重校正用于全景分割的纯卷积模型
https://arxiv.org/2312.06052 近年来,基于Transformer的模型由于其强大的建模能力以及对语义类和实例类的统一表示为全局二值掩码,在全景分割中占据主导地位。 在本文中,我们回顾了纯粹的卷积模型,并提出了一种新的结构MaskConve…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
