Gorm框架入门

GORM(Go Object Relational Mapper)是一个在Go语言中使用的对象关系映射(ORM)库。它允许开发者通过Go语言的结构体来定义数据模型,而不必直接编写SQL语句,从而简化了与数据库的交互和操作。

安装

go get -u github.com/jinzhu/gorm

连接数据库

gorm中有连接多种数据库的方式,这里以Mysql为例

package main

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

func main() {
	// 连接mysql数据库
	db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/users?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()
}

Gorm基本示例

首先创建一个struct,用来表示数据库中的数据。

type UserInfo struct {
	ID     uint
	Name   string
	Gender string
	Hobby  string
}

自动迁移

gorm框架自带的自动迁移功能使得开发者能够根据Go语言中定义的结构体自动创建或更新数据库表结构,而不必手动编写SQL语句。
根据上面定义的struct,只需要用AutoMigrate方法就能实现,会把结构体和数据表进行对应。

db.AutoMigrate(&UserInfo{})

执行代码后发现数据库users中多出来一个user_infos的表。

创建数据行

u1 := UserInfo{ID: 1, Name: "xay", Gender: "男", Hobby: "swim"}
db.Create(&u1)

运行结果如下图所示。
请添加图片描述

查询数据

var u UserInfo
db.First(&u)
fmt.Printf("u:%v", u)

// 运行结果:u:{1 xay 男 swim}

更新数据

db.Model(&u).Update("Hobby", "双色球")

// 运行结果:u:{1 xay 男 双色球}

删除数据

db.Delete(&u)

Gorm Model

GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的结构体,用继承的方式来使用。也可以自己定义字段。

type User struct {
	gorm.Model
	Name         string
	Age          sql.NullInt64
	Birthday     *time.Time
	Email        string  `gorm:"type:varchar(100);unique_index"`
	Role         string  `gorm:"size: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会默认使用字段中的id来作为主键,自己定义的格式如下:

// 使用`AnimalID`作为主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

表名

gorm.Model创建表时,会自动将表名定义为struct名的复数,如果遇到用驼峰法命名的struct名,会用下划线连接单词。自己定义的格式如下:

func (User) TableName() string {
	return "profiles"
}

func (u User) TableName() string {
	if u.Role=="admin" {
		return "admin_users"
	} else {
		return "users"
	}
}

用如下代码禁用复数命名

db.SingularTable(true)

也可以使用Table()方法来创建表

db.Table("xiaowang").CreateTable(&User{})

GORM还支持更改默认表名称规则,如果是指定的表名则不支持修改:

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

列名

列名由字段名称进行下划线分割来生成,如上面的MemberNumber在数据库中变成member_number
如果想要指定列名,可以用struct 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字段为当前时间,而不是直接将记录从数据库中删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lum1n0us

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值