首页 > 其他分享 >GORM快速入门

GORM快速入门

时间:2022-12-04 13:35:22浏览次数:59  
标签:入门 db gorm io UpdatedAt 快速 GORM string

Gorm(Go-orm框架)

The fantastic ORM library for Golang aims to be developer friendly. (Go语言对开发者最友好的ORM框架。) gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。

特性

链接

GitHub GORM地址: https://github.com/jinzhu/gorm
GORM中文官方文档地址:https://gorm.io/zh_CN/docs/

安装

#  安装gorm模块
go get -u gorm.io/gorm
# 安装链接数据库的包

# mysql
go get -u gorm.io/driver/mysql

# postgres
go get -u gorm.io/driver/postgres

# sqlserver
go get -u gorm.io/driver/sqlserver

# sqlite 基于 GGO 的 Sqlite 驱动
go get -u gorm.io/driver/sqlite
# sqlite 纯 Go 实现的 SQLite 驱动
go get -u github.com/glebarez/sqlite

连接数据库

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

MySQL

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

PostgreSQL

import (
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
)

func main() {
    dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
}

SQL Server

import (
  "gorm.io/driver/sqlserver"
  "gorm.io/gorm"
)
func main() {
    dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
    db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
}

SQLite

import (
  "gorm.io/driver/sqlite" 
  "gorm.io/gorm"
)
func main() {
    db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
}

连接池配置

在一个高效稳定的应用程序中,池化技术是非常重要的,他能最大程度上的保证应用程序的稳定性。GORM在数据库连接池为了让我们更加容易配置,它维护了连接的DB()方法,其返回值是*sql.DB的一个对象。该对象是database/sql 包我们可通过该对象的一些方法来自定义配置我们的数据库连接池,当然该对象的更多配置可参考具体官网。

// 通过调用DB()方法获取 *sql.DB对象
sqlDB, err := db.DB()

// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

当然GORM实现了许多的数据库连接,并不是所有连接都使用了database/sql ,所有使用该方法当底层不是*sql.DB对象时会抛出错误。

模型(Model)定义

任何ORM框架中,Model(ORM=>M)模型是必须存在的,在不同的语言中表示不同,在Java中,我们常常用类Class来表示一个模型。在Go中模型的标准则是sturct来表示。

示例:


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也内置了gorm.Model的结构体,它为我们提供了IDCreatedAtUpdatedAtDeletedAt。这个四个字段来满足我们常用的开发结构体。

// gorm 定义的结构体
type Model struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt DeletedAt `gorm:"index"`
}

如果需要使用其内置结构体,我们自需要更具Go 结构体的语法糖嵌入到自己的模型中即可正常使用。

// 嵌入内置结构体
type User struct {
	gorm.Model
	Name  string
	Email *string
}
// 嵌入gorm.Model后,该模型就有了以下七个属性
// ID  	CreatedAt  		UpdatedAt	UpdatedAt	DeletedAt	Name	Email

模型标记(tags)

tags是一种标记,其目的是为了让结构体能更好的模拟我们的数据库字段的属性。例如,在内置结构体中ID uint gorm:"primarykey" 属性,其中gorm:"primarykey"就是对该字段的约束,表示该字段是表的主键

GORM中支持的模型tags如下:

结构体标记(Tag) 描述
column 映射的列名
type 列数据类型
size 列的大小或长度
primaryKey 将列定义为主键
unique 将列定义为唯一键
default 定义列的默认值
precision 指定列的精度
scale 指定列大小
not null 指定列为 NOT NULL
default 列默认值
comment 列的注释
- 忽略字段加入数据库
autoUpdateTime 创建更新时更新时间
autoCreateTime 创建时插入时间
<- 设置字段写入权限<-false无写入权限,<-:create新增写入权限,<-:update更新权限
-> 设置字段读权限->:false不可读
check 约束索引,check:age>13check:name<>"小鸟"
index 创建索引
uniqueIndex 唯一性索引
autoIncrement 列自增
autoIncrementIncrement 自增步长

注意:tag 是可选的,GORM 支持以下 tag: tag 名不区分大小写,但建议使用驼峰命名。

当然,除了上面的标记tags之外,GORM还提供了关联关系的tags,在实际的开发中为了能提高数据库的运行效率,一般不推荐通过关联外键的形势来创建库表,所以下面的关联tags了解即可。

GORM约定

GORM中,为了能使开发者更加的关注业务开发,其使用了约定大于配置的设计思想。这些约定主要体现于表名主键列名原始的gorm.Model字段

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

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

// 将 User 的表名设置为 `profiles`
func (User) TableName() string {
  return "profiles"
}

// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`
db.SingularTable(true)


// 也可以通过Table()方法指定表名
// 使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})

// 自定义默认表名规则(在表名前加上表前缀)
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
  return "prefix_" + defaultTableName;
}

列名:列名默认为驼峰命名转下划线

// 默认映射数据库列名
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`
}

主键:默认使用ID来做主键

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

// 可以使用结构体tag指定主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

原始的gorm.Model字段:CreatedAt、UpdatedAt、 DeletedAt

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

标签:入门,db,gorm,io,UpdatedAt,快速,GORM,string
From: https://www.cnblogs.com/Rampant/p/16949719.html

相关文章

  • 算法刷题入门线性表|单调栈
     一、概念1、栈的定义栈 是仅限在 一端 进行 插入 和 删除 的 线性表。 栈 又被称为后进先出(LastInFirstOut)的线性表,简称LIFO。2、栈顶栈 是一......
  • 企业大数据可视化案例专题分享-入门
    一、什么是数据可视化?  基本概念:数据可视化是以图示或图形格式表示的数据。让决策者可以看到以直观方式呈现的分析,以便他们可以掌握困难的概念或识别新的模式。借助交互式......
  • Mybatis 入门实战(4)--Mybatis-Plus 使用
    MyBatis-Plus 是一个 MyBatis 的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。本文主要介绍Mybatis-Plus的基本使用,相关的环境及软件信息......
  • 3、使用 TVMC Python 入门:TVM 的高级 API
    本节将介绍针对TVM初学者设计的脚本工具。开始前如果没有下载示例模型,需要先通过终端下载resnet模型:cdmyscripts/mvresnet50-v2-7-frozen.onnxmy_model.onnx......
  • HyperLedger/Fabric 快速上手优化版 fabric-sdk-java
    文章目录​​1.前言​​​​2.前置条件​​​​3.区块链网络修改​​​​4.SDK操作步骤​​​​5.transaction.proto​​​​6.相关网址​​1.前言   由于fabri......
  • Dinger(叮鸽),基于springboot实现的群机器人消息发送中间件入门使用
     一、Dinger是什么Dinger(叮鸽)是一个以SpringBoot框架为基础开发的消息发送中间件,对现有两大移动办公系统​​钉钉​​​和​​企业微信​​的群机器人API做了一层封装......
  • JSP-入门学习、案例-改造Cookie案例
    JSP-入门学习4.JSP的内置对象:在jsp页面中不需要获取和创建,可以直接使用的对象jsp一共有9个内置对象。今天学习3个:request......
  • hdu: Public Sale(博弈入门)
    ProblemDescription虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。要种田得有田才行,Lele......
  • Zookeeper学习-入门教程
    一、Zookeeper概念Zookeeper是ApacheHadoop项目下的一个子项目,是一个树形目录服务。Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(......
  • 快速奔跑!纳多德入选2022年度“光谷瞪羚”企业
    12月2日,纳多德收到武汉东湖新技术开发区颁发的2022年度“光谷瞪羚”企业荣誉牌匾。纳多德作为技术能力强、成长潜力大、掌握关键核心技术的高成长企业,入选成为中国光谷瞪羚......