当前位置: 首页 > news >正文

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来实现的&#xf…...

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 个展台的类型。 在满足每一天展台需求的基础上,…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...