gorm
一、概述
The fantastic ORM library for Golang, aims to be developer friendly
全功能 ORM (无限接近)
- 关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
- 钩子 (在创建/保存/更新/删除/查找之前或之后)
- 预加载
- 事务
- 复合主键
- SQL 生成器
- 数据库自动迁移
- 自定义日志
- 可扩展性, 可基于 GORM 回调编写插件
- 所有功能都被测试覆盖
- 开发者友好
二、安装
1.go get 安装
go get -u github.com/jinzhu/gorm
2.使用
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
// Migrate the schema
db.AutoMigrate(&Product{})
// 创建
db.Create(&Product{Code: "L1212", Price: 1000})
// 读取
var product Product
db.First(&product, 1) // 查询id为1的product
db.First(&product, "code = ?", "L1212") // 查询code为l1212的product
// 更新 - 更新product的price为2000
db.Model(&product).Update("Price", 2000)
// 删除 - 删除product
db.Delete(&product)
}
三、gorm数据库连接实例封装
连接mysql为例
1.创建全局单例数据处理连接
mysqlConnectiPool.go
package mysqltools
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
"sync"
)
/*
* MysqlConnectiPool
* 数据库连接操作库
* 基于gorm封装开发
*/
type MysqlConnectiPool struct {
}
var instance *MysqlConnectiPool
var once sync.Once
var db *gorm.DB
var err_db error
func GetInstance() *MysqlConnectiPool {
once.Do(func() {
instance = &MysqlConnectiPool{}
})
return instance
}
/*
* @fuc 初始化数据库连接(可在mail()适当位置调用)
*/
func (m *MysqlConnectiPool) InitDataPool() (issucc bool) {
db, err_db = gorm.Open("mysql", "user:password@tcp(192.168.1.4:3306)/dbname?charset=utf8&parseTime=True&loc=Local")
fmt.Println(err_db)
if err_db != nil {
log.Fatal(err_db)
return false
}
//关闭数据库,db会被多个goroutine共享,可以不调用
// defer db.Close()
return true
}
/*
* @fuc 对外获取数据库连接对象db
*/
func (m *MysqlConnectiPool) GetMysqlDB() (db_con *gorm.DB) {
return db
}
2.初始化
import (
"log"
"mcGoApi/database/mysql/mysqltools"
"os"
)
func main() {
// init database pool
issucc := mysqltools.GetInstance().InitDataPool()
if !issucc {
log.Println("init database pool failure...")
os.Exit(1)
}
// do something...
}
3.调用
import (
"errors"
"github.com/jinzhu/gorm"
"mcGoApi/database/mysql/mysqltools"
"mcGoApi/datamodels/usermodels"
"sync"
)
/*
* @fuc 获取用户信息
* @user gorm对应的用户信息模型
* @dec 此方法为我为请求处理数据存取的封装类的方法,不细说
*/
func (r *userMemoryRepository) Select(userId string) (usermodels.User, error) {
// select
r.mu.Lock()
var user_ret usermodels.User
db = mysqltools.GetInstance().GetMysqlDB()
// 使用id获取记录
err := db.Where("id = ?", userId).First(&user_ret).Error
r.mu.Unlock()
if err != nil {
return usermodels.User{}, errors.New("查询失败")
}
return user_ret, nil
}