GORM连接数据库实践 | 青训营

307 阅读3分钟

GORM基本使用

GORM是一个用于Golang的优秀的ORM(对象关系映射)库,它可以让开发者方便地操作数据库,支持多种数据库驱动,如MySQL, PostgreSQL, SQLite, SQL Server等。GORM具有以下特点:

  • 全功能的ORM,支持一对一,一对多,多对多,多态,单表继承等关联关系。
  • 支持事务,嵌套事务,保存点,回滚到保存点等。
  • 支持批量插入,分批查询,使用Map或SQL表达式进行CRUD操作等。
  • 支持SQL构建器,Upsert,数据库锁,优化器/索引/注释提示等。
  • 支持复合主键,索引,约束等。
  • 支持自动迁移,自定义日志等。
  • 灵活的可扩展插件API,如数据库解析器(多数据库,读写分离),Prometheus等。
  • 开发者友好,每个特性都经过了测试的重重考验。

要使用GORM,首先需要安装GORM库和相应的数据库驱动:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite // 以sqlite为例

然后需要定义一个结构体来表示数据库中的一个表,并在结构体上添加gorm.Model来继承一些基本字段

type Product struct {
  gorm.Model // 继承ID, CreatedAt, UpdatedAt, DeletedAt字段
  Code  string
  Price uint
}

接下来需要打开一个数据库连接,并使用AutoMigrate方法来自动创建或更新表结构:

db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
  panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&Product{})

然后就可以使用GORM提供的各种方法来进行CRUD操作了。例如,要创建一个新的记录,可以使用Create方法:

// Create
db.Create(&Product{Code: "D42", Price: 100})

要查询一个记录,可以使用First方法,并传入主键值或条件:

// Read
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

要更新一个记录的字段值,可以使用ModelUpdateUpdates方法,并传入新的值:

// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

要删除一个记录,可以使用Delete方法,并传入主键值或条件:

// Delete - 删除 product
db.Delete(&product, 1)

GORM连接池

在高并发实践中,为了提高数据库连接的使用率,避免重复建立数据库连接带来的性能消耗,会经常使用数据库连接池技术来维护数据库连接。
gorm自带了数据库连接池使用非常简单只要设置下数据库连接池参数即可。

数据库连接池使用例子:
定义tools包,负责数据库初始化工作

//定义一个工具包,用来管理gorm数据库连接池的初始化工作。
package tools

//定义全局的db对象,我们执行数据库操作主要通过他实现。
var _db *gorm.DB

//包初始化函数,golang特性,每个包初始化的时候会自动执行init函数,这里用来初始化gorm。
func init() {
    ...忽略dsn配置,请参考上面例子...
    
    // 声明err变量,下面不能使用:=赋值运算符,否则_db变量会当成局部变量,导致外部无法访问_db变量
    var err error
    //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
    _db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
     
    sqlDB, _ := db.DB()

    //设置数据库连接池参数
    sqlDB.SetMaxOpenConns(100)   //设置数据库连接池最大连接数
    sqlDB.SetMaxIdleConns(20)   //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
}

//获取gorm db对象,其他包需要执行数据库查询的时候,只要通过tools.getDB()获取db对象即可。
//不用担心协程并发使用同样的db对象会共用同一个连接,db对象在调用他的方法的时候会从数据库连接池中获取新的连接
func GetDB() *gorm.DB {
	return _db
}

以上就是GORM的基本用法,希望这篇文章能够对你有所帮助。