Golang【gorm】快速开始
Golang 快速 开始 Gorm
2023-09-11 14:14:56 时间
概览
一个神奇的,对开发人员友好的 Golang ORM 库。
参考文档:
https://gorm.io/zh_CN/docs/
https://github.com/go-gorm/gorm
1 创建项目目录
PS E:\> mkdir gormlearn
使用多模块的工作空间
PS E:\gormlearn> go work init
PS E:\gormlearn> mkdir gormtest
创建 mod GOPATH索引文件
PS E:\gormlearn\gormtest> go mod init test.cn/gormtest
go: creating new go.mod: module test.cn/gormtest
引入模块
PS E:\gormlearn> go work use ./gormtest
2 安装 mysql、gorm、gin 包
官网采用 sqlite 库,我们采用 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
go.mod 官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
E:\gormlearn\gormtest\go.mod
module test.cn/gormtest
go 1.19
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.8.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/goccy/go-json v0.10.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/ugorji/go/codec v1.2.8 // indirect
golang.org/x/crypto v0.5.0 // indirect
golang.org/x/net v0.5.0 // indirect
golang.org/x/sys v0.4.0 // indirect
golang.org/x/text v0.6.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gorm.io/driver/mysql v1.4.5 // indirect
gorm.io/gorm v1.24.3 // indirect
)
3 新建数据库表
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
4 快速开始项目目录结构创建
4.1 新建入口文件
E:\gormlearn\gormtest\main.go
package main
import (
"log"
"github.com/gin-gonic/gin"
"test.cn/gormtest/router"
)
func main() {
r := gin.Default()
// 引入路由文件
router.InitRouter(r)
err := r.Run(":8888")
if err != nil {
/*
直接调用print来输出日志到终端
log.Fatalln("这是一条会触发fatal的日志。")
Fatal系列函数会在写入日志信息后调用os.Exit(1)。
*/
log.Fatalln(err)
}
}
4.2 新建初始化路由文件
新建 router 文件夹及 router.go 文件。
E:\gormlearn\gormtest\router\router.go
package router
import (
"github.com/gin-gonic/gin"
"test.cn/gormtest/api"
)
func InitRouter(r *gin.Engine) {
// 引入 api 接口
api.RegisterRouter(r)
}
4.3 新建 api 路由接口文件夹
4.3.1 新建 api 路由注册接口文件
E:\gormlearn\gormtest\api\router.go
package api
import (
"github.com/gin-gonic/gin"
"test.cn/gormtest/controllers/user"
)
func RegisterRouter(r *gin.Engine) {
r.GET("/save", user.SaveUser)
r.GET("/get", user.GetUser)
r.GET("/getall", user.GetAll)
}
4.3.2 新建 Model 文件夹
4.3.3 新建MySQL数据库连接文件
E:\gormlearn\gormtest\model\gorm.go
package model
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
func init() {
// 连接数据库
//配置MySQL连接参数
username := "root" //账号
password := "" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "test" //数据库名
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: logger.Default.LogMode(logger.Info),
})
if err != nil {
// Panic系列函数会在写入日志信息后panic。
panic("连接数据库失败, error=" + err.Error())
}
DB = db
}
4.3.4 新建 user 文件夹 user model 文件
package model
import (
"log"
"test.cn/gormtest/model"
)
/*
定义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"`
}
// 设置表名
func (u User) TableName() string {
return "users"
}
func SaveUser(user *User) {
// 数据库的操作,连接数据库
err := model.DB.Create(user).Error
if err != nil {
log.Println("insert user error:", err)
}
}
// 查询单条
func GetById(id int64) User {
var user User
err := model.DB.Where("id=?", id).First(&user)
if err != nil {
log.Println("get user by id error:", err)
}
return user
}
// 查询全部
func GetAll() []User {
var user []User
err := model.DB.Find(&user).Error
if err != nil {
log.Println("get user by id error:", err)
}
return user
}
4.4 新建 user 控制器
E:\gormlearn\gormtest\controllers\user\user.go
package user
import (
"time"
"github.com/gin-gonic/gin"
UserModel "test.cn/gormtest/model/user"
)
// 新增
func SaveUser(c *gin.Context) {
user := &UserModel.User{
Username: "zhangsan",
Password: "123e4r5",
CreateTime: time.Now().UnixMilli(),
}
UserModel.SaveUser(user)
c.JSON(200, user)
}
// 查询单条
func GetUser(c *gin.Context) {
user := UserModel.GetById(1)
c.JSON(200, user)
}
// 查询全部
func GetAll(c *gin.Context) {
user := UserModel.GetAll()
c.JSON(200, user)
}
4.5 预览
4.5.1 查询全部用户数据
4.5.2 查询单条数据
4.5.3 新增用户
4.5.4 更新用户数据
添加路由
E:\gormlearn\gormtest\api\router.go
package api
import (
"github.com/gin-gonic/gin"
"test.cn/gormtest/controllers/user"
)
func RegisterRouter(r *gin.Engine) {
// 新增用户
r.GET("/save", user.SaveUser)
// 查询单条用户数据
r.GET("/get", user.GetUser)
// 查询全部用户数据
r.GET("/getall", user.GetAll)
// 更新单条用户数据
r.GET("/updateuser", user.UpdateUser)
}
控制器添加 - 更新用户数据
E:\gormlearn\gormtest\controllers\user\user.go
package user
import (
"time"
"github.com/gin-gonic/gin"
UserModel "test.cn/gormtest/model/user"
)
// 新增
func SaveUser(c *gin.Context) {
user := &UserModel.User{
Username: "zhangsan",
Password: "123e4r5",
CreateTime: time.Now().UnixMilli(),
}
UserModel.SaveUser(user)
c.JSON(200, user)
}
// 查询单条
func GetUser(c *gin.Context) {
user := UserModel.GetById(1)
c.JSON(200, user)
}
// 查询全部
func GetAll(c *gin.Context) {
user := UserModel.GetAll()
c.JSON(200, user)
}
// 更新用户数据
func UpdateUser(c *gin.Context) {
UserModel.UpdateUser(1)
user := UserModel.GetById(1)
c.JSON(200, user)
}
model 添加 MySQL 更新用户数据
E:\gormlearn\gormtest\model\user\user.go
package model
import (
"log"
"test.cn/gormtest/model"
)
/*
定义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"`
}
// 设置表名
func (u User) TableName() string {
return "users"
}
func SaveUser(user *User) {
// 数据库的操作,连接数据库
err := model.DB.Create(user).Error
if err != nil {
log.Println("insert user error:", err)
}
}
// 查询单条
func GetById(id int64) User {
var user User
err := model.DB.Where("id=?", id).First(&user)
if err != nil {
log.Println("get user by id error:", err)
}
return user
}
// 查询全部
func GetAll() []User {
var user []User
err := model.DB.Find(&user).Error
if err != nil {
log.Println("get user by id error:", err)
}
return user
}
// 更新用户数据
func UpdateUser(id int64) {
err := model.DB.Model(&User{}).Where("id=?", id).Update("username", "lisi")
if err != nil {
log.Println("update user by id error", err)
}
}
4.5.5 删除用户数据
添加路由
E:\gormlearn\gormtest\api\router.go
// 删除单条用户数据
r.GET("/deluser", user.DeleteUser)
控制器添加
E:\gormlearn\gormtest\controllers\user\user.go
// 删除用户数据
func DeleteUser(c *gin.Context) {
UserModel.DeleteUser(5)
user := UserModel.GetById(5)
c.JSON(200, user)
}
模型添加
E:\gormlearn\gormtest\model\user\user.go
// 删除用户数据
func DeleteUser(id int64) {
err := model.DB.Where("id=?", id).Delete(&User{})
if err != nil {
log.Println("Delete user by id error", err)
}
}
相关文章
- Golang 安装第三方包
- Golang 【basic_leaming】 指针类型和值类型实现接口的区别以及接口嵌套
- Golang 【basic_leaming】M 2022 1
- 使用Golang快速构建WEB应用
- qqwry - 纯真ip库的golang服务
- golang中container/list包源码分析
- Golang 实现 Redis(2): 实现 Redis 协议解析器
- GoLang 中用 MongoDB Watch 监听指定字段的变化
- 【GoLang】3.3 切片
- golang之zap探索
- 【Golang开发】互联网大厂程序员一篇文章手把手带你在Mac上安装Golang开发环境并解决已知问题
- 深入解析golang几种非常主流的依赖注入框架,附实现案例及原理解析