Gorm连接Mysql数据库及其语法

Gorm连接Mysql数据库及其语法

文章目录

  • Gorm连接Mysql数据库及其语法
    • 前期工作
      • 找到Gorm的github项目
      • 简单了解相关MySQL语法
    • 启动数据库
    • 定义数据库模型注意点
    • Gorm Model定义
    • 结构体标签(tag)
      • 支持的结构体标记(Struct tags)
      • 关联相关标记(tags)
      • 主键(Primary Key)
      • 表名(Table Name)
      • 列名(Column Name)
      • 时间戳跟踪
        • CreatedAt
        • UpdatedAt
        • DeletedAt
    • 语法

前期工作

找到Gorm的github项目

  • 项目地址: github.com/jinzhu/gorm[http://github.com/jinzhu/gorm]
  • 拉取项目: go get -u github.com/jinzhu/gorm

简单了解相关MySQL语法


启动数据库

  • 前提: 想要连接数据库必须手动开启数据,以及手动创建数据库
  • 连接数据库:
    • 语法: db,err := gorm.Open(....)
    • 例子: db, err := gorm.Open("mysql", "root:password@(127.0.0.1:3306)/数据库?charset=utf8mb4")
    • 解析:
      • "mysql":表示你要连接数据库的类型
      • "root": 登陆数据库的用户名(默认root)
      • "password": 自己的密码
      • 数据库:表示要操作的数据库
      • "@(127.0.0.1:3306)": 表示需要连接的数据库本地地址,假如不记得端口是哪个可以在登录mysql后使用show global variables like 'port';查看端口
      • "?charset=utf8mb4":表示解析成的字节码

定义数据库模型注意点

  • 1.结构体的名称必须首字母大写,并且和数据库表名对应

  • 2.结构体中的字段名称首字母必须大写

  • 3.默认情况表名是结构体名称的复数形式

  • 4.可以使用结构体中自定义方法TableName改变结构体的默认表名称

    • //默认来说User结构体应该操作users表的
      //利用下述方法就可任意操作数据库中的表格
      func (User)TableName()string{return "user"
      }
      

Gorm Model定义

  • 作用: 模型结构体嵌入了 gorm.Model,那么就自动拥有上述这些字段和方法,可以避免重复编写,提高开发效率。

  • 默认字段:

    type Model struct {ID        uint `gorm:"primary_key"` //Id,一般默认id为主键(理解为表的第一个数据)CreatedAt time.Time					//创建 时间戳UpdatedAt time.Time					//更新 时间戳DeletedAt *time.Time `sql:"index"`  //删除 时间戳
    }
    
    • gorm:"primary_key"这里的被称为tag标签

结构体标签(tag)

支持的结构体标记(Struct tags)

在这里插入图片描述

关联相关标记(tags)

在这里插入图片描述


主键(Primary Key)

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

type User struct {ID   string // 名为`ID`的字段会默认作为表的主键Name string
}// 使用`AnimalID`作为主键
type Animal struct {AnimalID int64 `gorm:"primary_key"`Name     stringAge      int64
}

表名(Table Name)

表名默认就是结构体名称的复数,例如:

type User struct {} // 默认表名是 `users`// 将 User 的表名设置为 `profiles`
func (User) TableName() string {return "profiles"
}func (u User) TableName() string {if u.Role == "admin" {return "admin_users"} else {return "users"}
}// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`
db.SingularTable(true)

也可以通过Table()指定表名:

// 使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
 SELECT * FROM deleted_users;db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
 DELETE FROM deleted_users WHERE name = 'jinzhu';

GORM还支持更改默认表名称规则:

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

列名(Column Name)

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

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`
}

时间戳跟踪

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字段为当前时间,而不是直接将记录从数据库中删除。


语法

  • 相关语法可查询官方网站

  • https://gorm.io/zh_CN/docs/create.html
    jinzhu") // UpdatedAt将会是当前时间


#### DeletedAt如果模型有`DeletedAt`字段,调用`Delete`删除该记录时,将会设置`DeletedAt`字段为当前时间,而不是直接将记录从数据库中删除。---## 语法- 相关语法可查询官方网站- https://gorm.io/zh_CN/docs/create.html

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

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

相关文章

openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint

文章目录 openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint251.1 功能描述251.2 语法格式251.3 参数说明251.4 建议251.5 示例 openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint 251.1 功能描述 指明中间结果集的大小&a…

产品经理面试自我介绍,这3大错误千万别犯!

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货分享给大家~ 今天文…

最大的开源大模型:马斯克的Grok-1可供企业商用

由马斯克xAI团队研发的最大的开源大语言模型Grok-1,从头开始训练的总参数量为314B(3140亿)的混合专家(MoE)模型,其规模超过ChatGPT-3.5,目前Grok背后代码和权重架构已全部开放上线在GitHub。 下…

SqlServer服务启动报错10013

错误提示:MSSQLSERVER 服务启动异常不错10013 Windows不能在本地计算机启动SQLServer(MSSQLSERVER)。有关更多信 息,查阅系统事件日志。如果这是非Microsoft服务,请与服务厂商联系,并 参考特定服务错误代码10013。 解决 1、先禁用…

蓝桥杯 2023 省A 颜色平衡树

树上启发式合并是一个巧妙的方法。 dsu on tree,可以称为树上启发式合并,是一种巧妙的暴力。用一个全局数组存储结果,对于每棵子树,有以下操作: 先遍历轻儿子,处理完轻儿子后将数组清零(要再…

网络七层模型之数据链路层:理解网络通信的架构(二)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux相关命令(1)

1、找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。 find ./ -type f -name "*aaa*" ! -name "*bbb*" -exec touch {} \;文件系统操作命令 df:列出文件系统的整体磁盘使用情况 …

小孔平板应力集中问题matlab有限元编程【源码+PPT讲义】|三节点三角形单元|平面单元|稀疏矩阵 |Comsol网格

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

样本投递技术

投递技术 APT 组织主要以邮件作为投递载体,邮件的标题、正文和附件都可能携带恶意代码。主要的方式是附件是漏洞文档、附件是二进制可执行程序和正文中包含指向恶意网站的超链接这三种。 APT攻击的载荷类型: 文档类:主要是office文档、pdf文…

数组——LEETCODE的第35题(二分法与lower_bound函数)

数组——LEETCODE的第35题(二分法与lower_bound函数) 本文主要是根据leetcode 35题所写的关于数组的相关内容,主要包括: 数组的的特性leetcode第35题二分法的解题lower_bound函数的使用 文章目录 数组——LEETCODE的第35题&#x…

面试题(一)

目录 1.JDK、JRE、JVM之间的区别 2.hashcode()和equals()的区别 3.String、StringBuffer、StringBuilder的区别 4.泛型中extends和super的区别 5.和equals()的区别 6.重写和重载的区别 7.List和Set的区别 8.ArrayList和LinkedList区别 9.谈谈ConcurrentHashMap的原理 …

LangChain核心模块 Retrieval——文档加载器

Retrieval ​ 许多LLM申请需要用户的特定数据,这些数据不属于模型训练集的一部分,实现这一目标的主要方法是RAG(检索增强生成),在这个过程中,将检索外部数据,然后在执行生成步骤时将其传递给LLM。 ​ LangChain 提供…

Unsafe的CAS操作及线程park与unpark

如下是一个参照AQS进行的一个加锁及解锁的简单实现: 多线程并发进行同步业务操作;加锁:尝试进行cas 0->1操作;如果加锁成功则进行业务处理,然后进行锁释放 1->0,然后将列头的线程进行唤醒&#xff1…

GDAL中的地理坐标系、投影坐标系及其相互转换

目录 地理坐标系 国内常用地理坐标系 投影坐标系 国内常用投影坐标系(不推荐使用) 坐标转换 地理坐标转为投影坐标 投影坐标转为地理坐标 地理坐标系 原理参考这篇文章:地理坐标系与投影坐标系区别与联系 https://yunxingluoyun.blog.…

webserver如何从零开始?

我们要做一个项目,过程是怎么样的呢?git clone ...部署,测试,然后开始写么,这样你大概率会“猪脑过载”,对一个项目的每个部分都没有清晰认识,能写出什么来?写之前当然需要测试每个功…

Linux网络协议栈从应用层到内核层③

文章目录 1、write源码剖析2、vfs层进行数据传输3、socket层进行数据传输4、tcp层进行数据传输5、ip层进行数据传输6、网络设备层进行数据传输7、网卡驱动层进行数据传输8、数据传输的整个流程 1、write源码剖析 系统调用原型 ssize_t write(int fildes, const void *buf, si…

Linux 在线yum安装: PostgreSQL 15.6数据库

Linux 在线yum安装: PostgreSQL 15.6数据库 1、PostgreSQL数据库简介2、在线安装PostgreSQL15.63、配置 PostgreSQL的环境变量4、使用默认用户登录PostgreSQL5、配置 PostgreSQL 允许远程登录6、修改 PostgreSQL 默认端口7、创建数据库和表、远程用户zyl8、pgAdmin远…

MATLAB环境下基于离散小波变换和主成分平均的医学图像融合方法

随着计算机技术和生物影像工程的日趋成熟,医学图像为医疗诊断提供的信息越来越丰富。目前,由于医学成像的设备种类繁多,导致医生获得的图像信息差异较大。如何把这些信息进行整合供医生使用成为当务之急。基于此,医学图像融合技术…

vue3+vite配置环境变量

1、创建环境变量文件:首先在vue3项目根目录创建.env.development 和 .env.prodution两个文件,分别为开发和生产环境(必须.env.开头,需要额外环境,配置自定义的文件名称即可) 2、在环境变量文件分别写对应…

Android内存优化项目经验分享 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率,做了内存优化和下载导出优化,具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍: 一.拍摄前预览页面优化 预览效果问题 存在…