Golang GORM入门

news2025/6/18 5:39:26

一、GORM入门


1.1 什么是ORM

orm 是一种术语而不是软件
  • orm英文全称object relational mapping,就是对象映射关系
  • 简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的
  • 为了保证一致的使用习惯,通过 orm将编程语言的对象模型和数据库的关系模型建立映射关系 这样我们直接使用编程语言的对象模型进行操作数据库就可以了,而不用直接使用sql语言

使用golang的orm框架就是将golang当中的struct,就是结构体和数据库当中的表字段进行一个映射。也就是操作数据库不是直接操作数据库了,而是通过结构体了。当然这里要使用数据库相关的sdk了。

总而言之就是操作结构体就能够操作数据库,操作结构体,那么表里面的数据其实也就会跟着发生变化。

orm框架主要的作用就是,在go里面就是struct,在java里面其实就是class类,也即是让对象和表产生一个映射关系,我们就不需要操作表了,直接操作对象就行了。

1.2 什么是GORM

参考文档: https://gorm.io/zh_CN/docs/index.html
GORM 是一个神奇的,对开发人员友好的 Golang ORM
  • 全特性 ORM (几乎包含所有特性)
  • 模型关联 (一对一, 一对多,一对多 (反向), 多对多, 多态关联)
  • 钩子 (Before/After Create/Save/Update/Delete/Find)
  • 预加载
  • 事务
  • 复合主键
  • SQL 构造器
  • 自动迁移
  • 日志
  • 基于GORM回调编写可扩展插件
  • 全特性测试覆盖
  • 开发者友好

1.3 GORM(v2)基本使用

1. 安装
go get -u gorm.io/gorm

2. 连接MySQL

先创建一个数据库

mysql> create database test_db charset utf8; # 创建数据库
mysql> use test_db; # 切换到数据库
mysql> show tables; # 查看是否生成表
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
mysql> desc users; # 查看表的字段是否正常
+----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| username | longtext | YES | | NULL | |
| password | longtext | YES | | NULL | |
+----------+------------+------+-----+---------+----------------+
创建 mysql 连接 ,参考文档: https://gorm.io/zh_CN/docs/connecting_to_the_database.html

如果导入的包是不使用的,那么在前面加上_,比如

import _"gorm.io/driver/mysql"

不使用这个包为什么还要导入呢?当我导入进来不使用的时候,说明包里面init函数是要执行的,其实就是执行里面的init。

parseTime解析时间:gorm里面自带一些创建时间,更新时间,删除时间。在做映射关系的时候拿到的时候是一个时间对象,这里就会自动转化为时间对象。

loc=Local:用本地环境的一个时区
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	//这是固定写法
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic(err)
	}

	fmt.Println(db)
}
3. 自动创建表
参考文档: https://gorm.io/zh_CN/docs/models.html
其实开发当中不会使用这种,而是提前先创建好表,然后自己在数据库里面创建索引这些,而不是通过结构体标签来完成。
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id       int64 `gorm:"primary_key" json:"id"`
	Username string
	Password string
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		fmt.Println(err)
	}

	//自动迁移
	err = db.AutoMigrate(User{})
	if err != nil {
		fmt.Println(err)
	}

}


mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

mysql> desc users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | bigint   | NO   | PRI | NULL    | auto_increment |
| username | longtext | YES  |     | NULL    |                |
| password | longtext | YES  |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

4. 基本增删改查  

package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)


//自定义返回表名
func (* User) TableName() string {
	return "user"
}



// User 表的结构体ORM映射
type User struct {
    Id int64 `gorm:"primary_key" json:"id"`
    Username string
    Password string
}

func main() {
// 0、连接数据库
    dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
    charset=utf8mb4&parseTime=True&loc=Local"
    db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    db.AutoMigrate(User{})

    // 1、增
    db.Create(&User{
    //Id: 3,
    Username: "zhangsan",
    Password: "123456",
    })

    // 2、改
    db.Model(User{Id: 3,}).Update("username", "lisi")
    //db.Model(User{}).Where("id = 1").Update("username", "lisi")

    // 3、查
    // 3.1 过滤查询
    u := User{Id: 3}
    db.First(&u)
    fmt.Println(u)
    // 3.2 查询所有数据
    users := []User{}
    db.Find(&users)
    fmt.Println(users) // [{2 zhangsan 123456} {3 lisi 123456}]

    // 4、删
    // 4.1 删除 id = 3 的用户
    db.Delete(&User{Id: 3})
    // 4.2 条件删除
    db.Where("username = ?", "zhangsan").Delete(&User{})
}

上面所有使用到结构体的都和那张表有关系。

查询所有的数据。 

	var users []User
	db.Find(&users)
	fmt.Println(users)

二、模型定义


参考文档:https://gorm.io/zh_CN/docs/models.html

1. 模型定义
模型一般都是普通的 Golang 的结构体, Go 的基本数据类型,或者指针。
例子:

id这里其实就是一个主键,主键就是可以自增并且不能重复。

CreatedAt * time . Time `json:"createdAt" gorm:"column:create_at"`  你在创建的时候不需要传这个字段,你创建的时间会帮你自动加进去。在表里面创建的字段名叫 create_at。
建议在mysql里面将表创建好和设计好,然后再回过头来做gorm的操作。这些直接在数据库底层搞好就行了,不建议和上面一样写的乱七八糟。

2. 支持结构标签
标签是声明模型时可选的标记

上面这些直接在数据库里面限制死。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NumPy 数组学习手册:1~5

原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 译者:飞龙 一、NumPy 入门 让我们开始吧。 我们将在不同的操作系统上安装 NumPy 和相关软件,并查看一些使用 NumPy 的简单代码。 正如“序言”所述,SciPy 与 NumPy 密…

开放式蓝牙耳机推荐,推荐几款具有代表性的骨传导耳机

骨传导耳机是一种骨传导技术和音频技术结合的产品,通过声音将振动从骨头传到听觉神经,从而达到听音的效果。相比于传统的入耳式耳机,骨传导耳机佩戴更舒适,不会对耳朵造成损伤。然而市面上有很多不同类型的骨传导耳机,…

机器学习和深度学习在气象中的应用(台风预报只能订正、风速预报订正、LSTM 方法预测 ENSO)

查看原文>>>Python人工智能在气象中的实践技术应用 目录 专题一、Python 和科学计算基础 专题二、机器学习和深度学习基础理论和实操 2.1 机器学习和深度学习基础理论 2.2 sklearn 和pytorch 库 专题三 、气象领域中的机器学习应用实例 3.1 GFS 数值模式的风速…

【玩转RT-Thread】RT-Thread网络框架:BSD网络接口SAL套接字抽象层

文章目录RT-Thread网络框架:BSD网络接口&SAL套接字抽象层基础知识1.TCP与UDP的区别2.TCP编程 服务端配置过程3.TCP编程 客户端配置过程4.UDP编程 客户端配置过程SAL套接字抽象层1.SAL组件主要功能特点:2.SAL网络框架3.工作原理4.多协议接入与接口函数…

“成年人”的数据库,既要又要也要!

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 3 月 25 日,第一届 OceanBase 开发者大会在北京举行,《明说三人行》访谈栏目创始人兼主持人卢东明、沃趣科技创始人兼 CEO 陈栋、DBAplus 社群联合创始人杨建荣、PostgreSQL…

7.1 基本运算电路(2)

七、集成运放性能指标对运算误差的影响 在上述各电路运算关系的分析中,均认为集成运放为理想运放。而实际上,当利用运放构成运算电路时,由于开环差模增益 AodA_{od}Aod​、差模输入电阻 ridr_{id}rid​ 和共模抑制比 KCMRK_{CMR}KCMR​ 为有…

【计算机网络-应用层】域名系统 DNS、文件传输协议 FTP、电子邮件

文章目录1 域名系统 DNS1.1 域名结构1.2 域名服务器1.2.1 根域名服务器1.2.2 顶级域名服务器1.2.3 权限域名服务器1.2.4 本地域名服务器1.3 域名解析过程1.3.1 递归查询1.3.2 递归与迭代相结合查询1.3.3 本地域名服务器的高速缓存2 文件传输协议 FTP2.1 主动模式(建…

java编译和运行带有包名的类

写在前面 对于习惯了使用ide的我们似乎早已经忘记了如何通过命令行来编译和运行java类了,至少我是这样的,本文就一起来回顾下吧! 1:运行不带包的类 这种相信大多数朋友都记得,直接javac yourCode.java,然后java you…

Camtasia studio2023录屏和后期剪辑的软件

Camtasia 2023是专门用于屏幕录制的软件,功能十分丰富,不仅可以录制电脑屏幕、局部区域和摄像头等,而且还能即时编辑视频,给视频添加转场、旁白、字幕等,能够轻松制作更优秀的视频。 兼顾录屏和后期剪辑的软件—Camtas…

Oracle_EBS_核心功能(MFG)(第二部分)

BOM: Routing工艺路线应用:Bills of Material 职责:Bills of Material 基础业务学习总体说明 Routing(工艺路线)最终解决的问题是生产过程中加工顺序、资源和用量的标准化。准确度要求在98%以上,要不断与现场比对&…

【离散数学】图论

1、有n个点没有边 零图 2、有1个点没有边 平凡图 3、含有平行边的图 多重图 4、简单图 不含有平行边和自回环的图 5、任意两个结点之间都有边 完全图 6、环贡献 两度 7、所有顶点的度数之和等于边数的两倍 8、在有向图中所有顶点的出度之和 或者 入度之和 等于边数 9、度数为…

特斯拉和OpenAI的加持,马斯克简直人生赢家

赢家已定 商人行事,最重要的因素之一是利益驱动。这里,最服“马斯克”。 以马斯克为首的特斯拉公司周日宣布,将在上海新建一家超级工厂,专门生产该公司的储能产品Megapack。签约的特斯拉储能超级工厂项目也是该公司在美国本土以…

【论文笔记】CRN: Camera Radar Net for Accurate, Robust, Efficient 3D Perception

原文链接:https://arxiv.org/abs/2304.00670 1. 引言 本文提出两阶段融合方法CRN,能使用相机和雷达生成语义丰富且位置精确的BEV特征。具体来说,首先将图像透视特征转换到BEV下,该步骤依赖雷达,称为雷达辅助的视图变换…

大数据技术(入门篇) --- centos7安装CDH6.2集群

随着信息化时代的进步,业务系统的数据量出现了爆发式的增长,带来的不良结果就是数据库的数据量剧增,而部分业务系统需要实时数据,有些业务系统需要离线计算后的数据,所以就产生了大数据技术,因此最近在学习…

面试官:说一说mysql的varchar字段最大长度?

在mysql建表sql里,我们经常会有定义字符串类型的需求。 CREATE TABLE user (name varchar(100) NOT NULL DEFAULT COMMENT 名字 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 ;比方说user表里的名字,就是个字符串。mysql里有两个类型比较适合这个场景。 ch…

剧本拆分如何用ai人工智能辅助完成

随着现代技术的发展,人工智能在电影制作领域中的应用已经越来越普遍。其中,辅助剧本拆分是人工智能技术的一种重要应用。人工智能可以帮助电影制作人员更快速、更准确地进行剧本拆分,提高制作效率和创作质量。 剧本拆分是电影制作中非常重要的…

二叉树的链式结构

思维导图 二叉树的创建 先定义一个二叉树链式结构的结构体 typedef int BTDatatype; typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDatatype data; }BTNode; 手搓一个二叉树(前序遍历的方式创建二叉树放到OJ题…

nm命令 以及 C++11 编译出现找不到stringstream 以及 undefined reference to `std::runtime_error

最近在学习ZLMediaKit 源码 里面用到了很多C11 的知识 本地有一个 ubuntu18.04 的服务器 源码下下来发现 直接编译报很多错误 比如 找不到 std::runtime_error 找不到 stringstream 等等等 后来偶然的机会发现 是libstdc.so.6 太老了 找一个新的 替换掉这个就可以 …

新 Nano(五)自己写个库,读 DHT11 / DHT22

DHT11 这款温湿度传感器 几乎是所有 MCU 入门第一个传感器, 现在看来有些不合时宜, 毕竟过于廉价,数据不太靠谱,远不如 AHT10 好用。早年买了两个,按例程读出数据后就吃灰了。某日看到有人说自己按datasheet去读&#…

c#快速入门~在java基础上,知道C#和JAVA 的不同即可

☺ 观看下文前提:如果你的主语言是java,现在想再学一门新语言C#,下文是在java基础上,对比和java的不同,快速上手C#,当然不是说学C#的前提是需要java,而是下文是从主语言是java的情况下&#xff…