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

Go 语言常见的 ORM 框架

ORM(Object-Relational Mapping)是一种编程技术,用于将面向对象编程语言中的对象模型和关系数据库中的数据模型相互映射。ORM框架可以把数据操作从 SQL 语句中抽离出来,将关系型数据库中的表映射成对象,通过面向对象的方式操作数据库,提高了开发效率和代码可读性。ORM框架通常会提供持久化(Persistence)、查询数据(Query)和关系映射(Relationship Mapping)等核心功能。使用ORM,开发者可以更加专注于业务逻辑的实现,无需过多关注底层数据操作细节。常用的ORM框架有Hibernate、MyBatis、Entity Framework、Django ORM等。

Gorm

  • 下载:go get -u github.com/jinzhu/gorm

连接库

package mainimport "github.com/jinzhu/gorm"func main() {db, err := gorm.Open("mysql", "root:password@(127.0.0.1:3306)/db1?"+"charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)
}

创建表

CREATE TABLE `gorm_users`(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`phone` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE = InnoDB AUTO_INCREMENT = 39 DEFAULT CHARSET = utf8

定义结构体

type GormUser struct {ID uint `json:"id"`Phone string `json:"phone"`Name string `json:"name"`Password string `json:"password"`
}

插入数据

import ("github.com/jinzhu/gorm""crypto/md5""encoding/hex"
)func insert(db *gorm.DB) {GormUser := GormUser{Phone: "1888888888",Name: "Shirdon",Password: md5Password("666666"),}db.Save(&GormUser)//db.Create(&GormUser)
}
func md5Password(password string) string {hasher := md5.New()hasher.Write([]byte(password))return hex.EncodeToString(hasher.Sum(nil))
}

删除数据

func delete(db *gorm.DB) {var GormUser = new(GormUser)db.Where("phone = ?","1388888888").Delete(&GormUser)
}

查询数据

func selectDb(db *gorm.DB) {var GormUser = new(GormUser)db.Where("phone = ?","1888888888").Find(&GormUser)//db.First(&GormUser,"phone=?","1888888888")fmt.Println(GormUser)
}

更新数据

func update(db *gorm.DB) {var GormUser = new(GormUser)db.Model(&GormUser).Where("phone = ?","1888888888").Update("phone","1388888888")
}

错误处理

func update(db *gorm.DB) {var GormUser = new(GormUser)err := db.Model(&GormUser).Where("phone = ?","1888888888").Update("phone","1388888888").Errorif err != nil {//...}
}

事务处理

func transc(db *gorm.DB) {tx := db.Begin()GormUser := GormUser{Phone: "18888888888",Name: "Shirdon",Password: md5Password("666666"),}if err := tx.Create(&GormUser).Error;err!=nil {tx.Rollback()fmt.Println(err)}db.First(&GormUser,"phone =?","18888888888")tx.Commit()
}

日志处理

	db.LogMode(true)db.SetLogger(log.New(os.Stdout,"\r\n",0))

Beego

安装

  • go get github.com/astaxie/beego/orm
  • go get github.com/go-sql-driver/mysql

连接数据库

	maxIdle := 30maxConn := 30orm.RegisterDataBase("default","mysql","root:root@/orm_test?charset=utf8",maxIdle,maxConn)//orm.SetMaxIdleConns("default",30)//orm.SetMaxOpenConns("default",30)

注册模型

func init() {orm.RegisterModel(new(BeegoUser))//orm.RegisterModel(new(BeegoUser),new(Profile),new(Post))//orm.RegisterModel("prefix",new(BeegoUser))
}

定义表

CREATE TABLE `beego_user`(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增 ID',
`name` varchar(20) DEFAULT '' COMMENT '名字',
`phone` varchar(20) DEFAULT '' COMMENT '电话',
PRIMARY KEY(`id`)
)ENGINE = InnoDB DEFAULT CHARSET=utf8

定义结构体

type BeegoUser struct {Id intName stringPhone string
}

package mainimport ("fmt""github.com/astaxie/beego/orm"_ "github.com/go-sql-driver/mysql"
)type BeegoUser struct {Id    intName  stringPhone string
}func main() {o := orm.NewOrm()user := new(BeegoUser)user.Name = "Shirdon"user.Phone = "18888888888"fmt.Println(o.Insert(user))
}

func delete() {o := orm.NewOrm()user:= BeegoUser{}user.Id=7if num , err := o.Delete(&user);err!=nil{fmt.Println("删除失败")	} else {fmt.Println("删除数据影响的行数:",num)}
}

func selectDb() {o := orm.NewOrm()user := BeegoUser{} // 根据条件查询记录user.Id = 6err := o.Read(&user)if err == orm.ErrNoRows {fmt.Println("记录不存在")} else if err == orm.ErrMissPK {fmt.Println("缺少主键")} else if err != nil {fmt.Println(err)} else {fmt.Println(user)}
}

func update() {o := orm.NewOrm()user := BeegoUser{} // 根据条件查询记录user.Id=6user.Name="James"num, err := o.Update(&user)if err != nil {fmt.Println("更新失败")} else {fmt.Println("更新影响的行数:",num)}
}

原生查询

func rowQueryDb() {o := orm.NewOrm()var r orm.RawSeterr = o.Raw("UPDATE user SET name =? WHERE name =?", "James","jim")
}

事务

func transc() {o := orm.NewOrm()o.Begin() // 开启事务user1 := BeegoUser{}user1.Id = 6user1.Name = "James"user2 := BeegoUser{}user2.Id =12user2.Name = "Wade"_,err1 := o.Update(&user1)_,err2 := o.Insert(&user2)if err1 !=nil || err2 != nil{o.Rollback()}else {o.Commit()}}

调试模式下打印

	orm.Debug = truevar w io.Writerorm.DebugLog = orm.NewLog(w)

相关文章:

Go 语言常见的 ORM 框架

ORM(Object-Relational Mapping)是一种编程技术,用于将面向对象编程语言中的对象模型和关系数据库中的数据模型相互映射。ORM框架可以把数据操作从 SQL 语句中抽离出来,将关系型数据库中的表映射成对象,通过面向对象的…...

【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘

1. 错误提示 在python程序中试图导入一个名为cPickle的模块,但Python提示找不到这个模块。 错误提示:ModuleNotFoundError: No module named cPickle 2. 解决方案 实际上,cPickle是Python的pickle模块的一个C语言实现,通常用于…...

NodeJS14.18.0 安装,以及安装相应版本node-sass

安装了NVM, NodeJS 14.18.0 安装nvm 到c:\nvm目录 务必!!!!!!!! nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 编辑c:\nvm\settings.txt添加 node_mirror: CNPM Binar…...

cosover是什么?crossover23又是什么软件

cosover是篮球里的过人技巧。 1.crossover在篮球中的本意是交叉步和急速交叉步。crossover 是篮球术语,有胯下运球、双手交替运球,交叉步过人、急速大幅度变向等之意。 2.在NBA里是指包括胯下运球、变向、插花在内的过人的技巧。 NBA有很多著名的Cross…...

AR眼镜安卓主板,智能眼镜光机方案定制

AR智能眼镜是一项涉及广泛技术的创新产品,它需要考虑到光学、显示、功耗、散热、延迟、重量以及佩戴人体工学等多个方面的因素,每一个项目都是技术进步所需攻克的难题。 在本文中,我们将重点讨论AR眼镜的主板和光学方案。 首先是AR智能眼镜的…...

Qt中实现页面切换的两种方式

文章目录 方式一 :使用QStackedWidget讲解代码结构main.cpp完整代码运行结果: 方式二 :代码结构完整代码mainwindow.hnewmainwindow.hmain.cppmainwindow.cppnewmainwindow.cppmainwindow.uinewmainwindow.ui 效果 方式一 :使用QS…...

公司电脑如何限制安装软件

公司电脑如何限制安装软件 安企神终端管理系统下载使用 在企业环境中,电脑已经成为企业中必不可少的办公工具,确保员工的生产力和公司的信息安全是至关重要的。为了实现这一目标,公司可能会限制员工在某些情况下安装软件或者由管理员来为终…...

【C++】STL容器——list类的使用指南(含代码演示)(13)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一、list 类——基本介绍二、list 类——…...

Table-GPT:让大语言模型理解表格数据

llm对文本指令非常有用,但是如果我们尝试向模型提供某种文本格式的表格数据和该表格上的问题,LLM更有可能产生不准确的响应。 在这篇文章中,我们将介绍微软发表的一篇研究论文,“Table-GPT: Table- tuning GPT for Diverse Table…...

基于单片机的温湿度和二氧化碳检测系统设计

目录 摘 要... 2 第一章 绪论... 5 1.1 研究课题背景... 5 1.2 国内外发展概况... 7 1.3 课题研究的目的... 8 1.4 课题的研究内容及章节安排... 9 第二章 二氧化碳和温湿度检测系统控制系统的设计方案... 11 2.1 设计任务及要求... 11 2.2 二氧化碳和…...

leetcode做题笔记204. 计数质数

给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3&#…...

MySQL Server 5.5 软件和安装配置教程

MySQL 5.5.58(32/64位)下载链接: 百度网盘:百度网盘 请输入提取码 提取密码:7act 软件简介: MySQL 是由瑞典MySQL AB 公司开发一个关系型数据库管理系统,目前属于 Oracle 旗下产品。MySQL 是最…...

【23种设计模式】依赖倒置原则

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...

C++ 结构简介

假设要存储有关篮球运动员的信息,则可能需要存储他(她)的姓名、工资、身高、体重、平均得 分、命中率、助攻次数等。希望有一种数据格式可以将所有这些信息仔储在一个单元中。数组不能完成 这项任务,因为虽然数组可以存储多个元素,但所有元素的类型必须相同。也就是说,一个数组…...

element的tabs组件使用问题解决

1.去除el-tabs组件自带的键盘切换功能 今天在使用element的tabs组件时&#xff0c;发现这个tab组件自带了按键盘左右方向&#xff0c;切换tab的功能&#xff0c;可以通过使用keydown.native.capture.stop去除该事件 <el-tabs v-model"editableTabsValue"type&qu…...

python实验1 猜数字游戏

实验0&#xff1a;猜数字游戏 1. 猜数字游戏 版本12. 猜数字游戏 版本23. 猜数字游戏 版本34. 猜数字游戏 版本4 1. 猜数字游戏 版本1 题目猜数字游戏。在程序中预设一个0-9之间的整数, 让用户通过键盘输入所猜的数&#xff0c; 如果大于预设的数,显示“你猜的数字大于正确答案…...

docker 中给命令起别名

docker 的有些命令特别复杂&#xff0c;我们可以给它设置别名简化输入&#xff0c;就不用每次都输入那么多了&#xff01;&#xff01;&#xff01; 1. 进入 .bashrc 中修改配置&#xff08; .bashrc 是root下的隐藏文件&#xff09; cd /rootvim .bashrc2. 在 .bashrc 中加入…...

PHP的yaf框架自带插件

Yaf 框架的插件方法触发流程遵循一定的顺序&#xff0c;具体流程如下 Bootstrap 类的 _initPlugin 方法&#xff1a;在 Yaf 应用程序启动时&#xff0c;首先会执行 Bootstrap 类的 _initPlugin 方法。在这个方法中&#xff0c;你可以注册各种插件。例如&#xff1a; phpCopy …...

SpringCloud Alibaba【三】Gateway

Gateway配置与使用 前言新建gateway子项目pom.xml配置文件启动类访问接口方式 测试拓展 前言 在工作中遇到一种情况&#xff0c;一个父项目中有两个子项目。实际使用时&#xff0c;需要外网可以访问&#xff0c;宝信软件只能将一个端口号发布在外网上&#xff0c;所以需要运用…...

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里&#xff0c;你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...