Gorm的基本使用 | 青训营

70 阅读3分钟

简介

ORM(对象关系映射)是一种将数据库表中的数据映射到面向对象的模型中的技术,大大简化了程序操作数据库的复杂性。Gorm是golang编写的一个强大的ORM,非常容易上手也非常简洁美观。

特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

安装Gorm和数据库驱动

可以通过 go get 轻松安装 gorm

go get -u gorm.io/gorm  

根据使用的数据库安装对应的driver,例如可以这样安装MySQL的driver

go get -u gorm.io/driver/mysql

连接到数据库

引入刚刚安装的两个 package 后,就可以通过如下代码来对指定DSN (Data Source Name) 的Mysql数据库进行连接

dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic(err)
}

其中dsn需要根据个人需要来配置,例如连接密码为12345的root用户的tiktok数据库就需要把上面的user, password, databse 分别改成 root, 12345, tiktok。如果地址和端口号不是默认,也需要更改。

建表(自动迁移)

gorm可以通过struct来自动的建表,例如我们有如下结构体存储用户的令牌、名称和邮箱

type User struct {
    Id    int64
    Name  string 
    Email string
}

可以通过使用 AutoMigrate方法来自动创建/修改表格,达到模型和表格的统一。如果表格不存在数据库中,gorm会为我们自动建表,如果存在表格并且不一致,会试图自动修改表格,如果冲突会返回错误,并不会表格中存在对数据造成任何影响。

if err = db.AutoMigrate(&User{}); err != nil {
    panic(err)
}

实现 CRUD 增查改删

增Create

user := User{Name: "Bob", Email: "bob@example.com"}
if err := db.Model(&User{}).Create(&user).Error; err != nil {
    panic(err)
}
fmt.Println("user id:", user.Id)

我们通过上面的代码向数据库了一个条Name为Bob、Email为bob@example.com的记录。记录的id会返回到传入的对象中,可以打印出来看看。

查Read

if err := db.Model(&User{}).Where("id = ?", userId).First(&user).Error; err != nil {
    panic(err)
}
fmt.Printf("user %v: %#v", userId, user) 

这一段代码是查询id为userId的用户。同样的,所有的字段都会返回到user中,可以在后续使用。

改Update

if err := db.Model(&User{}).Where("id = ?", userId).Update("Name", "newname").Error; err != nil {
    panic(err)
}

我们修改了id为userId的用户的Name列,将它改成了"newname",

删Delete

if err := db.Model(&User{}).Delete(&user).Error; err != nil {
    panic(err)
}

总结

以上是gorm最基本的操作。我们完成了安装gorm以及mysql数据库驱动,然后使用gorm连接到指定dsn的数据库,接着通过自动迁移(AutoMigrate)来实现表格和模型的一致性,最后简单的用了几个例子展示了如何进行CRUD操作。当然这些都是入门级别的示例,我们在开发中会遇到很多比这复杂多的场景,这种时候最好的方式就是查阅资料看看别人是怎么做的,当然最好的方法是阅读官方文档来学习如何处理更加复杂的数据库业务。