快速入门
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
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
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
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
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
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
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
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
2
3
4
5
6
7
8
func GetUser(c *gin.Context) {
user := dao.GetById(1)
c.JSON(200, user)
}
1
2
3
4
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
2
3
4
5
6
7
8
func GetUser(c *gin.Context) {
user := dao.GetAll()
c.JSON(200, user)
}
1
2
3
4
5
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
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
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
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
2
3
4
5