Go语言ORM-gorm学习笔记(二)
时间:2022-07-22
本文章向大家介绍Go语言ORM-gorm学习笔记(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
惯例约定
gorm.model
gorm.model
是一个包含了ID
,CreatedAt
,UpdatedAt
,DeletedAt
四个字段的Golang结构体。你可以将它嵌入到你自己的模型中,当然你也可以完全使用自己的模型。
// gorm.Model 定义
type Model struct {
ID unit `gorm:"primary_key"` // 字段名为 ID 的字段默认作为表的主键
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
ID作为主键
GORM默认会使用名为ID的字段作为表的主键。
type User struct {
ID string // 名为ID的字段会默认作为表的主键
Name string
}
// 使用AnimalID作为主键
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
表名
表名默认就是结构体名称的复数,例如:
type User struct {} // 默认表名是users
// 将User的表名设置为profiles
func (User) TableName () string {
if u.Role == "admin" {
return "admin_users"
} else {
return "users"
}
}
// 禁用默认表名的复数形式,如果设置true,则User的默认表名是user
db.SingularTable(true)
指定表名称
// 使用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';
更改默认表名(table name)
你可以通过定义DefaultTableNameHandler来设置默认表名的命名规则
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "prefix_" + defaultTableName;
}
迁移(数据表操作)
自动迁移
自动迁移你的模型,使之保持最新状态。
警告:自动迁移只会创建表、缺失的列、缺失的索引,不会更改现有列的类型或删除未使用的列,以此来保护您的数据。
db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{}) // 可同时创建多张表
// 创建表时添加表后缀
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})
模型方法
Has Table
// 检查模型User的表是否存在
db.HasTable(&User{})
// 检查表users是否存在
db.HasTable("users")
Create Table
// 为模型User创建表
db.CreateTable(&User{})
// 创建表时会追加ENGINE=InnoDB到SQL语句中
db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})
Drop Table
// 删除模型User的表
db.DropTable(&User{})
// 删除表users
db.DropTable("users")
// 删除模型User的表和表products
db.DropTableIfExists(&User{}, "products") // 删除多张表,如果表存在则删除
ModifyColumn
修改列类型为给定的值
// 修改模型User的description列的类型为text
db.Model(&User{}).ModifyColumn("description", "text")
DropColumn
// 删除模型User的description列
db.Model(&User{}).DropColumn("description")
Add Indexes
添加索引
// 为name列添加名为idx_user_name的普通索引
db.Model(&User{}).AddIndex("idx_user_name", "name")
// 为name和age两列添加名为idx_user_name_age的复合索引
db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")
// 添加唯一索引
db.Model(&User{}).AddUniqueIndex("idx_user_name", "name")
// 为多列添加唯一索引
db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")
Remove Index
// 删除索引
db.Model(&User{}).RemoveIndex("idx_user_name")
- js行内式遇到的一些问题 DOM对象和jq对象转换的问题
- JavaWeb(三)servlet
- PL/SQL 编程(三 )程序包和包体,触发器,视图,索引
- 一次关于js事件出发机制反常的解决记录
- Java综合题目
- Ubuntu 16.04下为TITAN 1080 显卡安装驱动及Gpu版TensorFlow|深度学习
- 给新生成的节点(动态生成节点)绑定事件方法总结
- JavaWeb(四)JDBC操作Oracle
- JavaWeb(六)Listener监听器
- JSP引入 - UEditor 富文本编辑器
- JavaWeb(五)Filter过滤器
- JavaWeb(七)Cookie,EL表达式,标准标签库
- JavaWeb(八)JQuery
- 程序员如何提一个好问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端基础:JavaScript
- 设计模式(7)[JS版]-JavaScript设计模式之原型模式如何实现???
- SignalR 2.x入门(二):SignalR在MVC5中的使用
- SignalR简介
- 前端基础:jQuery
- Web API--入门--(一)ASP.NET Web API 2(C#)入门
- C# 关键字之 decimal
- 设计模式(8)[JS版]-JavaScript设计模式之如何实现适配器模式???
- Python3与OpenCV3.3 图像处理(二)--图像基本操作
- 前端基础:ECMAScript 6
- 设计模式(9)[JS版]-JavaScript设计模式之如何实现桥接模式???
- 前端基础:Boostrap
- 设计模式(10)[JS版]-JavaScript如何实现组合模式???
- JavaWeb - Servlet:基本概念,HTTP 协议,Tomcat 服务器
- 漫画:设计模式之 “工厂模式”