gorm使用指南(简单入门)

gorm是什么?

        gorm:一个Go语言开发的对象关系映射(ORM)库,它提供了一种简单而强大的方式来操作数据库。ORM 是一种编程技术,它允许开发人员使用面向对象的方式来操作数据库,而不需要直接编写 SQL 查询语句。

gorm的主要功能包括

  • 数据库驱动支持: GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、SQL Server 等。

  • 定义模型: 使用 GORM,开发人员可以定义 Go 结构体来表示数据库中的表,每个结构体字段对应表中的一个列。

  • 自动迁移: GORM 提供了自动迁移功能,可以根据模型定义自动创建或更新数据库表结构。

  • 查询构建器: GORM 提供了强大的查询构建器,可以轻松地构建复杂的数据库查询操作,支持链式调用、条件筛选、预加载等功能。

  • 事务支持: GORM 支持事务操作,可以确保数据库操作的原子性和一致性。

  • 钩子函数: GORM 提供了钩子函数机制,可以在数据创建、更新、删除等操作前后执行自定义的逻辑。

  • 关联关系: GORM 支持定义和处理不同表之间的关联关系,包括一对一、一对多、多对多等关系。

总的来说,GORM 简化了在 Go 语言中与数据库交互的过程,使得开发人员可以更加专注于业务逻辑的实现,而不需要关注底层的 SQL 查询语句。

gorm使用流程

1:gorm导入

go get gorm.io/gorm

2:导入数据库驱动

​//终端下载mysql的驱动:
go get gorm.io/driver/mysql

3:连接mysql数据库

func Init() error {
    var err error
    username := "root"    //数据库用户名
    password := "root"    //数据库密码
    host := "127.0.0.1"    //数据库主机号
    part := 3306    //数据库端口号
    Dbname := "gorm"    //数据库名称
    //root:root@tcp(127.0.0.1:3306)/gorm?
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s? charset=utf8mb4&parseTime=True&loc=Local",username,password,host,part, Dbname)
    //连接MYSQL,获得DB类型实例,用于后面的数据库读写操作
    db, err := gorm.Open(mysql.Open(dsn))
    if err != nil {
       panic("数据库连接失败,err=" + err.Error())
    }
    //连接成功
    fmt.Println(db)
    sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(2)    //设置连接池,空闲
	sqlDB.SetMaxOpenConns(5)    //设置打开最大连接
	if err=sqlDB.Close();err != nil {
		log.Println("数据库关闭失败")
		return err
	}
	return nil
}

4:数据库迁移映射

1,数据库字段迁移映射

这个gorm.Model是自动加上 Id ,create_timeupdate_timedelete_time

创建用户表user和评论表comment

type User struct {
	gorm.Model
	Username string `json:"username"  gorm:"unique;comment:用户登录名"`
	Password string `json:"password"  gorm:"comment:用户登录密码"`
	Avatar         string `gorm:"size:1000"`
	Email    string `json:"email"  gorm:"comment:用户邮箱"`
}

// 设置 User 模型对应的表名为 "sys_users"
func (User) TableName() string {
    return "sys_users"
}
type Comment struct {
	gorm.Model
	UserID      uint   `json:"user_id" gorm:"comment:用户id;foreignKey:fk_uid"`
	Content     string `json:"content" gorm:"comment:评论内容"`
	CommentTime string `json:"comment_time" gorm:"comment:评论时间"`
}

// 设置 Comment 模型对应的表名为 "sys_comments"
func (Comment) TableName() string {
    return "sys_comments"
}

2,数据库模型迁移

func migration() {
    // 自动迁移模式
    DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").
        AutoMigrate(&User{})

    // 自动迁移模式
    DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").
        AutoMigrate(&Comment{})
}

添加外键

func AddForeignKey() error {
    return DB.Exec("ALTER TABLE comments ADD CONSTRAINT fk_uid FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT ON UPDATE RESTRICT").Error
}

5:gorm操作数据库(增删改查)

1,增加用户

    var user model.User
    user := &model.User{
		UserId:   uid,
		Username: p.Username,
		Password: p.Password,
		Gender:   p.Gender,
		Email:    p.Email,
	}
    Db.Where("username = ?", p.Username).First(&user)
    if user.ID>0{
        log.Println("用户名已存在", zap.Error(err))
		return
    }
    if err = DB.Create(&user).Error; err != nil {
		log.Println("DB.Create(&user).Error", zap.Error(err))
		return
	}

2,删除用户

单个用户的删除(根据用户id)

var user model.User
err := model.DB.First(&user, ID).Error //根据id找到这个user,记得传地址。
//然后进行删除
err = model.DB.Delete(&user).Error

批量删除

db.Where("email like ? ","%123%").Delete(User{})

3,修改用户

  • Save 会保存所有的字段,即使字段是零值
  • Update 当使用Update更新单个列时,需要指定条件
  • Updates批量更新,只会更新指定字段,但如果是空值的情况下是不更新的成空值的。
//Save 会保存所有的字段,即使字段是零值  
    var user model.User
    user := &model.User{
		UserId:   uid,
		Username: p.Username,
		Password: p.Password,
		Gender:   p.Gender,
		Email:    p.Email,
	}
    err := model.DB.Save(&user).Error

//Update 当使用Update更新单个列时,需要指定条件
    model.DB.Model(model.User{}).Where("id=?", id).Update("email", email)

4,查找用户

  • First 是找到第一个
  • Last 是找到最后一个
  • Find 是找到全部
//查询第一个
var u1 User
db.First(&u1)
fmt.Println(u1)

//查询最后一个
db.Last(&u1)
fmt.Println(u1)

//按主键获取
db.First(&u1,2) //不指定的话,默认主键是id=2
fmt.Println(u1)

//获取所有数据
db.Find(&u1) //查询所有的数据信息
fmt.Println(u1)

where条件查询

//单一条件查询
var u2 User
db.Where("username = ?","张三").First(&u2)
fmt.Println(u2)

//模糊查询
db.Where("username LIKE ?","张%").Find(&u2)  //返回username姓张的所有数据
fmt.Println(u2)

查多个用Preload预加载

var comment []model.Comment
model.DB.Model(&comment).Preload("Children").Find(&comment)

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Gin是一个快速、灵活的Web框架,而GORM则是一个强大的ORM库,二者的配合可以非常方便地实现数据库操作。下面是一个简单的示例: 首先,在你的项目中引入Gin和GORM: ```go import ( "github.com/gin-gonic/gin" "gorm.io/gorm" "gorm.io/driver/mysql" ) ``` 接着,创建一个GORM的数据库连接: ```go dsn := "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } ``` 其中,dsn是你的数据库连接信息,可以根据实际情况进行修改。 然后,在Gin中使用db进行数据库操作: ```go // 定义一个模型 type User struct { gorm.Model Name string Age int } // 获取所有用户 func getUsers(c *gin.Context) { var users []User db.Find(&users) c.JSON(http.StatusOK, gin.H{ "users": users, }) } // 创建用户 func createUser(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } db.Create(&user) c.JSON(http.StatusOK, gin.H{ "user": user, }) } // 更新用户 func updateUser(c *gin.Context) { var user User if err := db.First(&user, c.Param("id")).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } db.Save(&user) c.JSON(http.StatusOK, gin.H{ "user": user, }) } // 删除用户 func deleteUser(c *gin.Context) { var user User if err := db.First(&user, c.Param("id")).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } db.Delete(&user) c.JSON(http.StatusOK, gin.H{ "message": "User deleted", }) } // 注册路由 func registerRoutes() { router := gin.Default() router.GET("/users", getUsers) router.POST("/users", createUser) router.PUT("/users/:id", updateUser) router.DELETE("/users/:id", deleteUser) router.Run(":8080") } func main() { registerRoutes() } ``` 在上面的示例中,我们定义了一个User模型,并在Gin中注册了一些路由,用于增删改查用户。在每个路由中,我们都使用了db来进行数据库操作。例如,在getUsers函数中,我们使用了db.Find(&users)来获取所有用户;在createUser函数中,我们使用了db.Create(&user)来创建用户。通过这样的方式,我们就可以非常方便地使用GORM进行数据库操作,而不需要手动写SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值