Gorm笔记

news/2024/5/2 17:52:42/文章来源:https://blog.csdn.net/qq_52563729/article/details/127006656
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)// UserInfo 用户信息
type UserInfo struct {ID uintName stringGender stringHobby string
}func main() {db, err := gorm.Open("mysql", "root:root1234@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil{panic(err)}defer db.Close()// 自动迁移db.AutoMigrate(&UserInfo{})u1 := UserInfo{1, "aaa", "男", "篮球"}u2 := UserInfo{2, "bbb", "女", "足球"}// 创建记录db.Create(&u1)db.Create(&u2)// 查询var u = new(UserInfo)db.First(u)fmt.Printf("%#v\n", u)var uu UserInfodb.Find(&uu, "hobby=?", "足球")fmt.Printf("%#v\n", uu)// 更新db.Model(&u).Update("hobby", "双色球")// 删除db.Delete(&u)
}

简单的增删查改连接数据库例子


gorm模型定义

1.内置的gorm.Model(不规定必须使用)

这个Model是自带的,我们来看它的定义

// gorm.Model 定义
type Model struct {ID        uint `gorm:"primary_key"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt *time.Time
}

使用的时候我们直接可以嵌入我们的模型中

// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {gorm.ModelName string
}

2.模型定义与tag

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

问题:User 结构体的属性 Birthday 和 MemberNumber,使用指针有什么含义?

默认所有字段的零值, 比如 0, ‘’, false 或者其它 零值,都不会保存到数据库内,使用指针可以避免这种情况。

tag标签可以自己指定,gorm可以支持的结构体标签

在这里插入图片描述

关联相关的tag

在这里插入图片描述


主键,表名,列名

1.主键

GORM 默认会使用名为ID的字段作为表的主键

type User struct {ID   string // 名为`ID`的字段会默认作为表的主键Name string
}

指定主键的方法

type Animal struct {AnimalID int64 `gorm:"primary_key"`Name     stringAge      int64
}

2.表名

1.表名默认是结构体名称的复数,而且都自动变成了小写

type User struct {} // 默认表名是 `users`

2.自定义表名:

// 将 User 的表名设置为 `profiles`
func (User) TableName() string {return "profiles"
}func (u User) TableName() string {if u.Role == "admin" {return "admin_users"} else {return "users"}
}

3.禁用默认表名的复数形式,如果置为 true,则 User 的默认表名是 user

db.SingularTable(true)

4.使用User结构体创建名叫 xiaowangzi的表

db.Table( name: "xiaowangzi").CreateTable(&User)

在这里插入图片描述
xiaowangzi和user的表结构是一样的!!!!!!!

5.GORM还支持更改默认表名称规则!!

DefaultTableNameHandler默认表名修改,比如说我们要加一个前缀prefix_

放最前面

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

这个函数只会修改默认的表名,下面这种情况就不会被修改,指定的表名就不会修改

在这里插入图片描述

3.列名

列名由字段名称进行下划线分割来生成

type User struct {ID        uint      // column name is `id`Name      string    // column name is `name`Birthday  time.Time // column name is `birthday`CreatedAt time.Time // column name is `created_at`
}

可以使用结构体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`
}

时间戳跟踪

1.CreatedAt

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

db.Create(&user) // `CreatedAt`将会是当前时间// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())

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

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

3.DeletedAt

软删除!!!!并不是真的删除

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

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

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

相关文章

软件工程毕设选题 SSM电影院在线售票系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 开发环境3.3 系统流程3.3.1 系统开发流程3.3.2 用户登录流程3.3.3 系统操作流程3.4 系统结构设计4 项目获取1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今…

VSCode远程开发LiveShare等

资料 https://blog.csdn.net/yh0503/article/details/89851899 VScode Remote 远程开发与调试 在 Visual Studio Code 中安装并登录到 Live Share Disconnected from host when reload a page on a shared server #497 coder/code-server 推荐 10 个你可能没见过的 VsCode 的高…

迭代法求解线性方程组(优于高斯消元法)

在学习了直接法求解线性方程组之后,我们会发现,直接法利用高斯消元法求解,计算量较大(O(n3时间复杂度))(因为高斯消元法需要将每个元素都要考虑进去)其次.无法利用矩阵的稀疏性(0元素…

Windows公网SSH远程公司内网linux

SSH(Secure Shell)是用于登录远程系统的协议,也是目前最流行的远程连接Linux服务器的协议,默认SSH在端口22上运行。 而linux服务器下一般都会安装ssh服务,可以建立安全的远程连接。当我们在外而临时有事需要远程公司内…

[数据结构]-玩转八大排序(二)冒泡排序快速排序

前言 作者:小蜗牛向前冲 名言:我可以接收失败,但我不能接收放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一 冒泡排…

无刷电机驱动板开发,加速无刷时代前进步伐

无刷电机是由电机主体和电机驱动板组成的一种没有电刷和换向器的机电一体化产品。随着控制板的应用场景逐渐丰富,控制板开发技术日益增强,目前无刷电机的发展方向,首先就是对无刷电机驱动板的开发。 无刷电机的优点非常的多,其中最…

Nginx系列之请求处理的11个阶段(下)

上篇博客介绍了PostRead阶段涉及的模块的作用,此篇博客将介绍剩余阶段所涉及的模块作用 Preaccess阶段的limit_conn和limit_req模块 限速(rate limiting)是NGINX中一个非常有用的特性,可以用它来限制在一段时间内的HTTP请求数量…

慢查询 MySQL 定位优化技巧,从10s优化到300ms

1.如何定位并优化慢查询SQL? 一般有3个思考方向 1.根据慢日志定位慢查询sql 2.使用explain等工具分析sql执行计划 3.修改sql或者尽量让sql走索引 2.如何使用慢查询日志? 先给出步骤,后面说明 有3个步骤 1.开启慢查询日志 首先开启慢查询…

office project【图文详解】

Office Project是一款全面实用的项目管理软件。 Office Project2021正式版来自推出的项目管理软件。最新版本的Microsoft Office Project2021软件拥有最简单的项目管理方法,用户可以根据每个人的工作情况轻松分配工作量和项目执行时间。Project 安装包各个版本 htt…

(附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740

摘 要 本文介绍了使用PHPMySQL数据库和微信应用为儿童艺术学校实现教育应用的过程。本文介绍的教育应用是为儿童艺术学校设计的,这意味着该系统可用于教授儿童艺术和艺术视频。该系统的主要功能是可以将儿童艺术教育的线下方式转变为线上,从教育机构的角…

微信小程序组件介绍

组件view 普通视图区域 类似于html中的div是一个块级元素 .wxml代码 <view class"container1" ><view>温度</view><view>湿度</view> <view>光照强度</view> </view> .wxss代码—— .container1 view{width: 100…

linux 内存管理

用户空间与内核空间 人间还是仙界&#xff1f;聊一聊linux系统的用户空间和内核空间 以32 位Linux系统为例&#xff0c;虚拟地址的大小是4GB (0x0000_0000 ~ 0xffff_ffff)。 Linux 用户空间和 内核空间的大小可以通过设置宏 PAGE_OFFSET 来配置&#xff0c;默认PAGE_OFFSET 0…

Oracle数据库中的包(七)

目录 1.Oracle中包 2.包的创建 &#xff08;1&#xff09;可视化方式创建包 &#xff08;2&#xff09;以命令方式创建包 ①创建包头 ②创建包体 ③删除包 3.包的初始化 4.重载 ①相关概念和注意事项 ②系统内置的包 Oracle学习的相关知识点&#xff08;汇总&#x…

UGeek大咖说 | 直播预告:顺丰高难度可观测性压测实践与应用

本月「UGeek大咖说-大厂可观测」又双叒……来和大家见面了&#xff01;本期大咖说特邀到顺丰科技应用架构高级工程师——李卓做客直播间&#xff0c;用实际案例带我们一起剖析大型复杂系统下可观测性在全链路压测中的落地实践。 往期大咖说我们对可观测性做了很多诠释和分享&a…

2022安徽省赛赛题——B-2任务二:流量分析

有题有环境有解析,要的私我,勿喷! B-2任务二:流量分析 *任务说明:仅能获取Server2的IP地址 1.使用Wireshark查看并分析Server2桌面下的capture.pcapng数据包文件,找出黑客获取到的可成功登录目标服务器Telnet服务的账号密码,并将黑客获取到的账号密码作为Flag值(用户…

开创性的区块链操作系统项目——去中心化簿订单交易所

关于区块链操作系统上的 Web2 和 Web3 先驱系列今天向大家介绍来自Dakai的 Peter、Laszlo 和 Mark 。Web3 开发人员通过他们的去中心化簿订单交易所推进了区块链技术的发展。他们正在使用 Python 和 SQLite 作为数据库引擎来进行开发&#xff0c;他们发现他们可以在区块链操作系…

js与jquery实例-拖动改变列宽和行高

如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂。先看效果图:html结构:html结构:<!DOCTYPE HTML> <html> <head><meta charset="utf-8"><title>table&…

最适合从事游戏建模这类高薪职业的是这些人,快来看看有你吗?

随着游戏行业的发展&#xff0c;游戏建模受到越来越多的人的关注&#xff0c;那游戏建模的学习适用于什么样的人群呢&#xff1f;今天就来介绍一下吧 01 大学毕业&#xff0c;就业方向不明确 大学期间&#xff0c;本专业知识没有深度掌握&#xff0c;无法从事本专业相关的工作…

Vue3 i18国际化

本文参考了两片文章如下&#xff0c;博文原创&#xff0c;转载附上本博文链接即可 1、基于Vue3.0和ElementPlus开发后台框架(loginbacki18n)_zzzzzzzzzz的博客-CSDN博客_vue3后台框架 &#xff08;这个有点没看懂&#xff09; 2、https://www.jianshu.com/p/fa85595642cd&am…

盘点一个Python网络爬虫实战问题

大家好,我是皮皮。 一、前言 前几天在Python铂金交流群【红色基因代代传】问了一个Python网络爬虫的问题,提问截图如下:代码截图如下:报错截图如下:要么就是原始网页没那么多数据,要么就是你自己取到的数据没那么多,有的有排名,有的没有,可以考虑加个try异常处理。首先…