Go ORM 干啥的?

​胖sir :接着,给你一个馅饼儿

兵长 : 来嘞!!
一篇来自ORM的整理笔记…

1 什么是ORM?为什么要⽤ORM?

什么是ORM ,即Object-Relationl Mapping,它的作⽤是在关系型数据库和对象之间作⼀个映射,

这样,我们在具体的 操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象⼀样操作它就可以了 。

ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建⽴在概念模型的基础上的。

  • 域模型是⾯向对 象的
  • 关系模型是⾯向关系的

⼀般情况下,⼀个持久化类和⼀个表对应,类的每个实例对应表中的⼀条记录,

类的每个属性对应表的每个字段。

ORM技术特点:

  • 提⾼了开发效率。

    由于ORM可以⾃动对Entity对象与数据库中的Table进⾏字段与属性的映射,所以我们实际 可能已经不需要⼀个专⽤的、庞⼤的数据访问层。

  • ORM提供了对数据库的映射,不⽤sql直接编码,能够像操作对象⼀样从数据库获取数据。

ORM的缺点

ORM的缺点是会牺牲程序的执⾏效率和会固定思维模式。

从系统结构上来看,采⽤ORM的系统⼀般都是多层系统,系统的层次多了,效率就会降低。ORM是⼀种完全的 ⾯向对象的做法,⽽⾯向对象的做法也会对性能产⽣⼀定的影响。

2 ORM操作数据

package main

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

// UserInfo 用户信息
//orm会默认根据结构体创建table , orm采用的是linux命名方式  即小写加下划线,且会在名字后面加 s
//会创建user_infos 表
type UserInfo struct {
   
	gorm.Model
	ID     uint
	Name   string
	Gender string
	Hobby  string
}

//  truncate table 表名
//  数据库需要提前创建好  例如mygorm
//  parseTime是查询结果是否⾃动解析为时间
//  loc是MySQL的时区设置
//  charset是编码方式
func main() {
   
	fmt.Println("try open mysql connection....")
	db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/mygorm?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
   
		panic(err)
	}
	fmt.Println("successful")
	defer db.Close()
	// 自动迁移
	//若该表不存在则创建该表,若该表存在且结构体发生变化则更新表结构
	db.AutoMigrate(&UserInfo{
   })
	u1 := UserInfo{
   gorm.Model{
   }, 1, "xiaozhu", "man", "playing"}
	// 创建记录
	result := db.Create(&u1)
	fmt.Println("result:", result.RowsAffected)
	// 查询
	var u = new(UserInfo)
	//查询一条记录
	db.First(u)
	fmt.Printf("First: %#v\n", u)
	//按照条件查询
	var uu UserInfo
	db.Find(&uu, "name=?", "xiaozhu")
	fmt.Printf("Find: %#v\n", uu)
	// 更新
	db.Model(&uu).Update("hobby", "sing")
	// 删除 , 此处删除记录,是不会将数据表中的数据删除掉,而是deleted_at 会更新删除时间
	db.Delete(&uu)
}

  • 使用gorm必须要先创建好数据库
  • gorm会自动创建数据表,且表结构可以动态变化
  • gorm创建的表命名方式为 代码中结构体命名的转换, 例如 结构体命名为UserInfo,则table会命名为user_infos
  • gorm修改表结构非常的容易
  • gorm是完全面向对象的思想

3 模型定义

模型是标准的 struct,由 Go 的基本数据类型、实现了 ScannerValuer 接口的自定义类型及其指针或别名组成

例如:

type User struct {
   
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}

自定义模型

遵循 GORM 已有的约定,可以减少您的配置和代码量。

type User struct {
   
   gorm.Model   // 内嵌
   Name         string
   Age          sql.NullInt64
   Birthday     *time.Time
   Email        string  `gorm:"type:varchar(100);uniqueIndex"`
   Role         string  `gorm:"size:255"`        // 设置字段大小为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 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 camelCase 风格

标签名 说明
column 指定 db 列名
type 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not nullsize, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INSTREMENT
size 指定列大小,例如:size:256
primaryKey 指定列为主键
unique 指定列为唯一
default 指定列的默认值
precision 指定列的精度
scale 指定列大小
not null 指定列为 NOT NULL
autoIncrement 指定列为自动增长
autoIncrementIncrement 自动步长,控制连续记录之间的间隔
embedded 嵌套字段
embeddedPrefix 嵌入字段的列名前缀
autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
index 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
uniqueIndex index 相同,但创建的是唯一索引
check 创建检查约束,例如 check:age > 13,查看 约束 获取详情
<- 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
-> 设置字段读的权限,->:false 无读权限
- 忽略该字段,- 无读写权限
comment 迁移时为字段添加注释

关联标签

标签 描述
foreignKey 指定当前模型的列作为连接表的外键
references 指定引用表的列名,其将被映射为连接表外键
polymorphic 指定多态类型,比如模型名
polymorphicValue 指定多态值、默认表名
many2many 指定连接表表名
joinForeignKey 指定连接表的外键列名,其将被映射到当前表
joinReferences 指定连接表的外键列名,其将被映射到引用表
constraint 关系约束,例如:OnUpdateOnDelete

4 主键、表名、列名的约定

主键(Primary Key)

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

 type User struct {
    

 ID string // 名为`ID`的字段会默认作为表的主键 

 Name string 

 }
// 使⽤`AnimalID`作为主键 

type Animal struct {
    

AnimalID int64 `gorm:"primary_key"` 

Name string 

Age 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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值