Gorm框架入门

文章目录

    • 安装
    • 连接数据库
    • 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 mainimport ("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     uintName   stringGender stringHobby  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.ModelName         stringAge          sql.NullInt64Birthday     *time.TimeEmail        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     stringAge      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.mzph.cn/news/195978.shtml

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

相关文章

C++基础 -37- 模板函数与普通函数调用规则

当模板函数比普通函数更好匹配形参的时候&#xff0c;会优先调用模板函数 #include "iostream"using namespace std;template <class T> void show(T a, T b) {cout << a << endl;cout << b << endl;cout << "temp show&…

华为认证 | HCIP和HCIE差别很大吗?

根据ICT从业者的学习和进阶需求&#xff0c;华为认证分为工程师级别、高级工程师级别和专家级别三个认证等级&#xff0c;分别就是HCIA、HCIP以及HCIE。 这三个级别中&#xff0c;HCIA作为一个比较入门级别的考试&#xff0c;选择的人比较少&#xff0c;大多数小伙伴可能会更关…

idea中如何使用git?

在 IntelliJ IDEA 中使用 Git 进行版本控制是一个常见且重要的操作。以下是使用 Git 的基本步骤&#xff0c;包括如何在 IDEA 中设置 Git&#xff0c;以及执行常用的 Git 操作。 1. 安装 Git 首先&#xff0c;确保您的计算机上已安装 Git。您可以从 Git 的官方网站 下载并安装…

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK&#xff0c;有时也称作四位元PSK、四相位PSK、4-PSK&#xff0c;在坐标图上看是圆上四个对称的点。通过四个相位&#xff0c;QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率&#xff08;BER&#xff09; —…

销售时如何站在客户角度思考问题?

销售时如何站在客户角度思考问题&#xff1f; 好的&#xff0c;以下是对提供的内容进行润色后的结果&#xff1a; 当销售时&#xff0c;如何站在客户的角度去思考问题呢&#xff1f;这需要我们具备一种换位思考的能力&#xff0c;从客户的角度出发&#xff0c;了解他们的需求…

Taro H5 在支付宝打开白屏的问题解决

一、前言 问题描述&#xff1a;基于 taro 框架的 H5&#xff0c;本地构建或者发到服务器后&#xff0c;安卓手机在支付宝APP中打开链接呈现白屏的情况&#xff0c;但是在其他浏览器或者微信中打开正常&#xff1b;问题根源&#xff1a;由于支付宝的 webview 浏览器内核不支持 …

INFINI Easysearch 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…

Autosar通信实战系列03-NM模块要点及其配置介绍

本文框架 前言1. NM模块要点介绍1.1 NM基本功能介绍1.2 NM协同功能介绍2. NM配置2.1 NmGlobalConfig配置2.2 NmChannelConfigs配置前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑分析,调测试方法及典型问…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1&#xff1a;解决思路2解决思路3&#xff08;最终解决方案&#xff09;后记 bug背景 项目中采用富文本编辑器后传参引起的bug&#xff0c;起因如下&#xff1a; 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1&#xff1a; 使用JSON方…

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

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

【Git】Git撤销操作

记录一下&#xff0c;方便后续查找&#xff0c;不全&#xff0c;后续再做补充。 丢弃当前工作区未提交的修改 # 丢弃所有修改 git checkout .# 丢弃某个文件修改 git checkout 文件名丢弃本地已经提交的代码 &#xff08;1&#xff09;撤销最近一次提交 如果我们在最近一次提…

C++ 系列 第五篇 C++ 算术运算符及类型转换

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 C 系列 第四篇 C 数据类型…

第十五届蓝桥杯模拟赛(第二期 C++)

俺自己做的噢&#xff0c;还未核实答案&#xff0c;若有差错&#xff0c;望斧正。 第一题 小蓝要在屏幕上放置一行文字&#xff0c;每个字的宽度相同。小蓝发现&#xff0c;如果每个字的宽为 36 像素&#xff0c;一行正好放下 30 个字&#xff0c;字符之间和前后都没有任何空隙…

voc获取文件夹下所有文件的文件名(去掉后缀)

import osdef get_file_names(folder_path rC:\Users\mage\Desktop\Timer\Segformer\datasets\ImageSets\JPEGImages, output_file_name test.txt):# 获取文件夹下所有文件的文件名&#xff08;去掉后缀&#xff09;file_names [os.path.splitext(file)[0] for file in os.l…

94.STM32外部中断

目录 1.什么是 NVIC&#xff1f; 2.NVIC寄存器 3.中断优先级 4.NVIC的配置 设置中断分组​编辑 配置某一个中断的优先级 5.什么是EXTI 6.EXTI和NVIC之间的关系 7.SYSCFG 的介绍 1.什么是 NVIC&#xff1f; NVIC是一种中断控制器&#xff0c;主要用于处理 ARM Cort…

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 使用先进的机器学习技术和优化算法…

【C++ regex】C++正则表达式

文章目录 前言一、正则表达式是什么&#xff1f;二、<regex>库的基础使用2.1 第一个示例2.1 <regex>库的函数详解std::regex_matchstd::regex_searchregex_search 和 regex_match 的区别std::regex_replacestd::regex_iterator 和 std::sregex_iterator&#xff1a…

❀My学习Linux命令小记录(13)❀

目录 ❀My学习Linux命令小记录&#xff08;13&#xff09;❀ 51.su指令 52.sudo指令 53.shutdown指令 54.reboot指令 55.poweroff指令 ❀My学习Linux命令小记录&#xff08;13&#xff09;❀ 51.su指令 功能说明&#xff1a;用于切换当前用户身份到其他用户身份。 &am…