Go语言xorm框架
xorm
xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。
官网: https://xorm.io/
中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md
特性
- 支持 Struct 和数据库表之间的灵活映射,并支持自动同步
- 事务支持
- 同时支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用。
- 支持使用ID,In,Where, Limit,Join,Having,Table, SQL,Cols等函数和结构体等方式作为条件
- …
安装
go get xorm.io/xorm
同步结构体到数据库
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}//定义一个和表同步的结构体,并且自动同步结构体到数据库type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}err = engine.Sync(new(User))if err != nil {println("表结构同步失败")}}
注:后续需要增加表的字段只需要在结构体中新增对应字段,然后执行改代码,即可把字段同步至数据库。
数据插入
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}user := User{Id: 1,Name: "wk",Age: 18,Passwd: "wwwwwwww",}//插入单挑affected, err := engine.Insert(&user)if affected >= 1 {println("数据插入成功")}//定义切片var users []Userusers = append(users, User{Id: 2,Name: "wk",Age: 18,Passwd: "wwwwwwww",})users = append(users, User{Id: 3,Name: "wk",Age: 18,Passwd: "wwwwwwww",})//插入切片affected, err = engine.Insert(&users)
}
更新和删除
- Update更新数据,默认只更新非空和非0的字段 。
- Delete 删除记录,需要注意,删除必须至少有一个条件,否则会报错。
- Exec 执行一个SQL语句
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}user := User{Name: "cs",}//更新一条数据_, err = engine.ID(1).Update(&user)user = User{Name: "wk",}//删除一条数据_, err = engine.ID(3).Delete(&user)//直接执行sqlengine.Exec("update user set name = ? where id = ?", "ddddddd", 2)}
数据查询
- Query 最原始的也支持SQL语句查询,返回的结果类型为 []map[string] []byte。Querystring 返回 []map[string]string
- QueryInterface 返回 []map[string]interface{}
- Get 查询单条记录
- Find 查询多条记录
- Count 获取记录条数
- Iterate 和 Rows 根据条件遍历数据
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}//查询result, err := engine.Query("select * from user")fmt.Println(result)result2, err := engine.QueryString("select * from user")fmt.Println(result2)result3, err := engine.QueryInterface("select * from user")fmt.Println(result3)//Get查询方法user := User{}engine.Get(&user)fmt.Println(user)//指定条件来查询用户user1 := User{Name: "cs"}engine.Where("name=?", user1.Name).Asc("id").Get(&user1)fmt.Println(user1)//获取指定字段的值var name stringengine.Table(&user).Where("id=1").Cols("name").Get(&name)fmt.Println(name)//Find查询多条记录var users []Userengine.Where("passwd='wwwwwwww'").Limit(10, 0).Find(&users)fmt.Println(users)//根据条件查询总条数userCount := User{}total, err := engine.Count(&userCount)fmt.Println(total)//Iterate 和 Rows 根据条件遍历数据engine.Iterate(&userCount, func(idx int, bean interface{}) error {user := bean.(*User)fmt.Println(user)return nil})rows, err := engine.Rows(&user)defer rows.Close()for rows.Next() {rows.Scan(user)fmt.Println(user)}
}
事务
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}//创建事务并开启session := engine.NewSession()defer session.Close()session.Begin()defer func() {err := recover()if err != nil {session.Rollback()} else {session.Commit()}}()user := User{Id: 3, Name: "RRRR", Age: 20, Passwd: "54644"}if _, err := session.Insert(&user); err != nil {panic(err)}
}
具体官方文档地址:https://gitea.com/xorm/xorm/src/branch/master/README_CN.md
相关文章:
Go语言xorm框架
xorm xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。 官网: https://xorm.io/ 中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md 特性 支持 Struct 和数据库表之间的灵活映射,并支持自动同步事务支持同时支持原始SQL…...
19_微信小程序之优雅实现侧滑菜单
19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果,布局其实很简单,整体布局是一个横向滚动的scroll-view,难点在于怎么控制侧滑菜单的回弹,以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的…...
JSP中JDBC与javaBean学习笔记
本博文源于博主偷偷复习期末的java web,博文主要讲述JDBC API与JavaBean,涉及driver,driver Manager\connection、statement接口、PreparedStatement接口、ResultSet接口,JavaBean包含一些标记介绍。 1.JDBC API JDBC由一组接口和类组成&am…...
编译Android系统源码推荐的电脑配置
工欲善其事,必先利其器。 看到很多客户,搞Android产品开发,用的电脑配置是惨不忍睹。 这些老板脑子有坑吗... ------------ 编译Android9推荐电脑配置: 处理器:酷睿i7 5代系列 8线程以上 内存: 8GB以上…...
加油站会员管理小程序实战开发教程10
上一篇我们介绍了计算距离及到店导航的功能,本篇我们介绍一下今日油价的功能。 如果要按日显示最新的数据,那么我们首先需要有数据源来存放每日的油价数据。这里涉及数据源的时候要考虑你的数据是只录入一条,还是每日录入一条。 录入一条呢,比较简单,但有个问题是如果我…...
shell编程之条件判断和流程控制
typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures本节课程目标一、条件判断语法结构2. 条件判断相关参数㈠ 判断文件类型㈡ 判断文件权限㈢ 判断文件新旧㈣ 判断整数㈤ 判断字符串㈥ 多…...
第一次接触jquery
文章目录一.关于jqurey二.什么是jqurey三.上课实例1.表格 2.鼠标移动效果 3隐藏和显示效果代码如下注意一.关于jqurey 简而言之:jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 二.什么是jqurey jQuery 是一个 JavaScript 函数库。 jQu…...
Vue中 引入使用 babel-polyfill 兼容低版本浏览器
注意:本文主要介绍的 vue-cli 版本:3.x, 4.x; 最近在项目中使用 webpack 打包后升级,用户反馈使用浏览器(chrome 45)访问白屏。经过排查发现:由于 chrome 45 无法兼容 ES6 语法导致的…...
ArcGIS Enterprise on Kubernetes 11.0安装示例
博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录安装前置条件基本安装解压文件生成秘钥执行安装脚本配置DNS方法一方法二…...
js 防抖函数 节流函数
某些事件中(如 onresize onscroll onkeydown onkeyup onmousemove …),会连续触发函数的执行,如果函数执行一些耗时的操作(如请求数据…),会影响性能,也有可能造成服务器压力。这时可以用 防抖函数 或 节流函数解决这种问题。 防…...
Yarn节点unhealthy解决办法
这几天用Spark计算任务时,发现yarn上有两个节点不参与计算,很是tm的离谱。使用下面的命令查看Yarn上的nodemanager节点状态yarn node -list -all发现两个节点处于unhealthy状态。经过Google查明原因:这种情况一般是因为那个节点上HDFS文件过多…...
【jumpServer 功能梳理】
用户管理 1.1 用户列表 创建jumpServe 账号 ;角色分为用户 管理员;更新账号信息;查看用户详情以及授权的资产; 1.2 用户组 用户组,这个组的意义在于用一个统称对接资源;用户组包含多个用户,可以操作增加删除…...
中国各省人力资本测算就业人员受教育程度构成(2000-2021年)
数据来源:自主整理 时间跨度:2000-2021年 区域范围:全国各省 指标说明: 人力资本测算公式:(小学*6初中*9高中*12大专及以上*16)/六岁及以上人口 参考文献: [1]罗仁福, 刘承芳,…...
java面试题-集合篇
Collection1.Collection有哪些类?Java集合框架中的Collection接口是所有集合类的基础接口,定义了一些基本的集合操作,如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操…...
Python 异步: 同时运行多个协程(10)
asyncio 的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储,然后同时一起执行。这可以使用 asyncio.gather() 函数来实现。 让我们仔细看看。 1. 什么是 Asyncio gather() asyncio.gather() 模块函数允许调用者将多个可等待对象组合在一…...
SVN 获取多版本间的更新内容
文章目录背景介绍操作步骤 - 获取某段时间内的代码更新内容背景介绍 公司有个项目期初明确要做微信小程序,没有做其他端的意向,并且当时团队人数有限,没有项目实践过 uniapp,项目时间周期紧,就没有用 uniapp 去实现 然…...
c++ const使用说明
作⽤ 1. 修饰变量,说明该变量不可以被改变; 2. 修饰指针,分为指向常量的指针和指针常量; 3. 常量引⽤,经常⽤于形参类型,即避免了拷⻉,⼜避免了函数对值的修改; 4. 修饰成员函数…...
VSTO 开发 EXCEL 委托与多线程的极简示例
VSTO 开发 EXCEL 委托与多线程的极简示例问题解决步骤代码问题 这几天做 excel 加载项时遇到一个问题,对话框弹窗显示后,需要等待网络数据的返回来填充 ListBox 控件,由于网络延迟问题,整个窗体连带 Excel 一起白屏卡顿 5-10秒&a…...
spring之使用Spring的AOP
文章目录前言一、准备工作1、添加相应的依赖2、添加相应的命名空间3、创建目标类4、创建切面二、使用AOP1.在切面类中编写增强代码以及切点表达式2、开启aspectj的自动代理3、测试类4、测试结果前言 Spring对AOP的实现包括以下三种方式 1、Spring框架结合AspectJ框架实现的AOP…...
LeetCode LCP 66. 最小展台数量
力扣嘉年华将举办一系列展览活动,后勤部将负责为每场展览提供所需要的展台。 已知后勤部得到了一份需求清单,记录了近期展览所需要的展台类型, demand[i][j] 表示第 i 天展览时第 j 个展台的类型。 在满足每一天展台需求的基础上,…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
