快速入门

gorm地址:https://github.com/go-gorm/gorm

对开发者友好的gorm库,目前使用最广的go orm库之一

1. 入门

数据库以目前使用最多的mysql为例。

//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm
//安装gin
go get -u github.com/gin-gonic/gin
1
2
3
4
5
6

涉及到的数据库sql:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `username` varchar(30) NOT NULL COMMENT '账号',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `createtime` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建时间',
   PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1
2
3
4
5
6
7
//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应
type User struct {
    ID int64 // 主键
	//通过在字段后面的标签说明,定义golang字段和表字段的关系
	//例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username
	Username string `gorm:"column:username"`
	Password string `gorm:"column:password"`
	//创建时间,时间戳
	CreateTime int64 `gorm:"column:createtime"`
}
1
2
3
4
5
6
7
8
9
10
package dao

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

var DB *gorm.DB

func init() {
	//配置MySQL连接参数
	username := "root"   //账号
	password := "root" //密码
	host := "127.0.0.1"  //数据库地址,可以是Ip或者域名
	port := 3306         //数据库端口
	Dbname := "gorm"     //数据库名
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
	DB = db
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

插入数据:

package dao

import "log"

type User struct {
	ID         int64
	Username   string `gorm:"column:username"`
	Password   string `gorm:"column:password"`
	CreateTime int64  `gorm:"column:createtime"`
}

func (u User) TableName() string {
	//绑定MYSQL表名为users
	return "users"
}

func Save(user *User) {
	err := DB.Create(user)
	if err != nil {
		log.Println("insert fail : ", err)
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package api

import (
	"github.com/gin-gonic/gin"
	"test.com/gormtest/dao"
	"time"
)

func SaveUser(c *gin.Context) {
	user := &dao.User{
		Username:   "zhangsan",
		Password:   "123456",
		CreateTime: time.Now().UnixMilli(),
	}
	dao.Save(user)
	c.JSON(200, user)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package api

import "github.com/gin-gonic/gin"

func RegisterRouter(r *gin.Engine) {
	r.GET("/save", SaveUser)
}

1
2
3
4
5
6
7
8

测试,数据成功保存,并获取到id

查询:

func GetById(id int64) User {
	var user User
	err := DB.Where("id=?", id).First(&user).Error
	if err != nil {
		log.Println("get user by id fail : ", err)
	}
	return user
}
1
2
3
4
5
6
7
8
func GetUser(c *gin.Context) {
	user := dao.GetById(1)
	c.JSON(200, user)
}
1
2
3
4
func GetAll() []User {
	var users []User
	err := DB.Find(&users)
	if err != nil {
		log.Println("get users  fail : ", err)
	}
	return users
}
1
2
3
4
5
6
7
8
func GetUser(c *gin.Context) {
	user := dao.GetAll()
	c.JSON(200, user)
}

1
2
3
4
5

更新:

func UpdateById(id int64) {
	err := DB.Model(&User{}).Where("id=?", id).Update("username", "lisi")
	if err != nil {
		log.Println("update users  fail : ", err)
	}
}

1
2
3
4
5
6
7
func UpdateUser(c *gin.Context) {
	dao.UpdateById(1)
	user := dao.GetById(1)
	c.JSON(200, user)
}

1
2
3
4
5
6

删除:

func DeleteById(id int64) {
	err := DB.Where("id=?", id).Delete(&User{})
	if err != nil {
		log.Println("delete users  fail : ", err)
	}
}

1
2
3
4
5
6
7
func DeleteUser(c *gin.Context) {
	dao.DeleteById(1)
	user := dao.GetById(1)
	c.JSON(200, user)
}
1
2
3
4
5