Gorm框架入门

news2024/11/19 12:40:07

文章目录

    • 安装
    • 连接数据库
    • Gorm基本示例
      • 自动迁移
      • 创建数据行
      • 查询数据
      • 更新数据
      • 删除数据
    • Gorm Model
      • 主键
      • 表名
      • 列名
    • 时间戳
      • CreatedAt
      • UpdatedAt
      • DeletedAt

GORM(Go Object Relational Mapper)是一个在Go语言中使用的对象关系映射(ORM)库。它允许开发者通过Go语言的结构体来定义数据模型,而不必直接编写SQL语句,从而简化了与数据库的交互和操作。

安装

go get -u github.com/jinzhu/gorm

连接数据库

gorm中有连接多种数据库的方式,这里以Mysql为例

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
	// 连接mysql数据库
	db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/users?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()
}

Gorm基本示例

首先创建一个struct,用来表示数据库中的数据。

type UserInfo struct {
	ID     uint
	Name   string
	Gender string
	Hobby  string
}

自动迁移

gorm框架自带的自动迁移功能使得开发者能够根据Go语言中定义的结构体自动创建或更新数据库表结构,而不必手动编写SQL语句。
根据上面定义的struct,只需要用AutoMigrate方法就能实现,会把结构体和数据表进行对应。

db.AutoMigrate(&UserInfo{})

执行代码后发现数据库users中多出来一个user_infos的表。

创建数据行

u1 := UserInfo{ID: 1, Name: "xay", Gender: "男", Hobby: "swim"}
db.Create(&u1)

运行结果如下图所示。
请添加图片描述

查询数据

var u UserInfo
db.First(&u)
fmt.Printf("u:%v", u)

// 运行结果:u:{1 xay 男 swim}

更新数据

db.Model(&u).Update("Hobby", "双色球")

// 运行结果:u:{1 xay 男 双色球}

删除数据

db.Delete(&u)

Gorm Model

GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的结构体,用继承的方式来使用。也可以自己定义字段。

type User struct {
	gorm.Model
	Name         string
	Age          sql.NullInt64
	Birthday     *time.Time
	Email        string  `gorm:"type:varchar(100);unique_index"`
	Role         string  `gorm:"size:255"`
	MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
	Num          int     `gorm:"AUTO_INCREMENT"`  // 设置 num 为自增类型
	Address      string  `gorm:"index:addr"`      // 给address字段创建名为addr的索引
	IgnoreMe     int     `gorm:"-"`               // 忽略本字段
}

主键

该Model会默认使用字段中的id来作为主键,自己定义的格式如下:

// 使用`AnimalID`作为主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

表名

gorm.Model创建表时,会自动将表名定义为struct名的复数,如果遇到用驼峰法命名的struct名,会用下划线连接单词。自己定义的格式如下:

func (User) TableName() string {
	return "profiles"
}

func (u User) TableName() string {
	if u.Role=="admin" {
		return "admin_users"
	} else {
		return "users"
	}
}

用如下代码禁用复数命名

db.SingularTable(true)

也可以使用Table()方法来创建表

db.Table("xiaowang").CreateTable(&User{})

GORM还支持更改默认表名称规则,如果是指定的表名则不支持修改:

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
	return "prefix_" + defaultTableName;
}

列名

列名由字段名称进行下划线分割来生成,如上面的MemberNumber在数据库中变成member_number
如果想要指定列名,可以用struct tag来实现

type Animal struct {
  AnimalId    int64     `gorm:"column:beast_id"`         // set column name to `beast_id`
  Birthday    time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`
  Age         int64     `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}

时间戳

CreatedAt

如果模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。

db.Create(&user) // `CreatedAt`将会是当前时间

// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())

UpdatedAt

如果模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。

db.Save(&user) // `UpdatedAt`将会是当前时间

db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间

DeletedAt

如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,而不是直接将记录从数据库中删除。

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

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

相关文章

网工学习10-IP地址

一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示,中间用…

lua完整学习笔记

lua注释 -- 单行注释 --[[ 多行注释 ]]-- lua数据结构 nil 无效值与Java的Null类似,但是在条件表示中是false boolean 布尔值,ture或者false number 双精度类型的浮点数 string 字…

撬动内容 10 倍增长,如何实现企业级全域内容治理

随着流量利好即将出尽,那些曾经仅依靠流量堆砌的营销策略,如今显得黯然失色。在新的市场环境下,更大的增长机会在哪里? 继续追求「运营效率」还是确立全新「战略定位」,企业的增长还有哪些新的可能性? 在刚…

日常操作之新增物料组并自动关联科目

1、创建物料组 OMSF 后台配置路径如下图: 直接创建一个物料组,给到对应描述即可。这里没有控制参数 2.、创建评估类 OMSK 我们在OBYC中配置科目时,是没有通过物料组的维度配置对应科目哦,但是评估类经常会用到GBB中的科目配置都…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,AOP提供了非常强…

【已解决】为什么Word文档里有部分内容无法编辑?

小伙伴们是否遇到过这样的情况,打开Word文档进行编辑,发现部分内容可正常编辑,另外一部分内容却无法编辑。这是怎么回事,又要如何解决呢? 出现以上情况,一般是Word文档被设置了“限制保护”,使…

【文末送书】Python OpenCV从入门到精通

文章目录 🍔简介opencv🌹内容简介🛸编辑推荐🎄导读🌺彩蛋 🍔简介opencv OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和…

第1章 理解知识图谱:知识图谱现状、知识图谱应用场景(二)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

css实现正六边形嵌套圆心

要实现一个正六边形嵌套圆心,可以使用CSS的::before和::after伪元素以及border-radius属性。以下是具体的解析和代码: 使用::before和::after伪元素创建正六边形。设置正六边形的背景色。使用border-radius属性使正六边形的内角为60度。在正六边形内部创…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

Spatial Data Analysis(一):线性回归

Spatial Data Analysis(一):线性回归 来源:https://github.com/Ziqi-Li/GEO4162C/tree/main 在此示例中,我们将介绍如何在 python 中拟合线性回归模型。 我们将使用的数据集是 2020 年县级选举投票数据以及来自 ACS …

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展,企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率,越来越多的企业开始选择使用ERP软件进行管理。然而,市场上现成的ERP软件并不能完全满足企业的需求&#…

css 修改滚动条样式,解决Windows浏览器中滚动条不美观问题

Windows环境中的浏览器中滚动条默认是直接显示了,不管光标是否进入该区域,这样就很不美观,如下图: 之前样式为 .well {display: block;background-color: #f2f2f2;border: 1px solid #ccc;margin: 5px;width: calc(100% - 12px);h…

HarmonyOS/OpenHarmony应用开发

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代, 搭建一个智能终端设备操作系统的框架和平台, 促进万物互联产业的繁荣发展。 了解OpenHarmony HarmonyOS是华为通过OpenHarmony项目,结合商业…

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。 Google登录界面也会出现如下提示 这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致 国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这…

2023年江西省“振兴杯”网络信息行业职业技能竞赛 Web4 Writeup

这次振兴杯碰到的一道题&#xff0c;某些姿势之前貌似没有碰过&#xff0c;简单记一下吧 源码 <?php class Bird{public $funcs;public $salt;public $flag;function say_flag(){$secret hash_hmac(sha256, $_GET[salt], file_get_contents(/flag));$hmac hash_hmac(sha…

BearPi Std 板从入门到放弃 - 引气入体篇(5)(printf打印到串口)

简介 基于 BearPi Std 板从入门到放弃 - 引气入体篇&#xff08;4&#xff09;(Usart 中断接收), 使用printf打印到串口 步骤 覆写fputc函数 需要添加头文件#include “stdio.h” /* USER CODE BEGIN 0 */ int fputc(int ch, FILE *f) {uint8_t temp[1] {ch};{HAL_UART_Tr…

服务器托管与服务器租用的详细比较

​  在当今数字化时代&#xff0c;服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式。它们都提供了一种将服务器放置在专业机房中的解决方案&#xff0c;但在具体实施和使用过程中存在一些差异。下面将详细比较这两种方式的优势和劣势。 1. 服务器托管 服务器托…

Python机器学习、深度学习入门丨气象常用科学计算库、气象海洋常用可视化库、爬虫和气象海洋数据、气象海洋常用插值方法、EOF统计分析、WRF模式后处理等

目录 专题一 Python软件的安装及入门 专题二 气象常用科学计算库 专题三 气象海洋常用可视化库 专题四 爬虫和气象海洋数据 专题五 气象海洋常用插值方法 专题六 机器学习基础理论和实操 专题七 机器学习的应用实例 专题八 深度学习基础理论和实操 专题九 深度学习的应…