gorm使用和实例封装

gorm

  • gorm
  • 一、概述
  • 二、安装
    • 1.go get 安装
    • 2.使用
  • 三、gorm数据库连接实例封装
    • 1.创建全局单例数据处理连接
    • 2.初始化
    • 3.调用

一、概述

  • 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
}

你可能感兴趣的:(GoLang)