【关键工具】gorm
1.1 gorm说明
Gorm,一个神奇的,对开发人员友好的 Golang ORM 库
1.2 安装
首先,需要安装golong,且配置了GOPATH环境变量。
在联网环境下,执行 go get -u github.com/jinzhu/gorm和go get -u github.com/lib/pq获取源码包。(若设置了代理,执行git config --global --unset https.proxy取消代理)
离线环境下,解压压缩包到GOPATH目录下。
1.3 导入说明
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
1.4 编译说明
执行go build或go run 命令编译测试案例
go build test.go;./test 或 go run test.go
2.1 建立连接
const (
host = "192.168.6.128"
port = 54321
user = "system"
password = "123456"
dbname = "test"
) //全局常量
//连接串
connInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",host, port, user, password, dbname)
//连接数据库
db, err := gorm.Open("postgres", connInfo)
if err!= nil{
panic(err)
}
defer db.Close()
2.2 关闭连接
db.Close()
2.3 连接池
GORM 使用 database/sql 维护连接池,dotabase/sql包中实现了通用的连接池。
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
3.1 模型定义
模型是标准的 struct,由 Go 的基本数据类型。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名
通过tag标记gorm来创建在数据库中字段的约束和属性配置
// UserInfo 结构
type UserInfo struct {
ID uint `gorm:"primary_key;AUTO_INCREMENT"`
UserId uint `gorm:"not null;index:idx_user_id"`
Name string
Age int
Sex string
Hobby string
}
gorm定义 |
数据库字段约束 |
gorm:"primary_key" |
字段设置为主键 |
gorm:"AUTO_INCREMENT" |
字段设置为自增 |
gorm:"size:20 |
字段长度设置为20 |
gorm:"index:idx_user_id |
字段设置普通索引,名称为idx_user_id |
gorm:"not null |
设置字段为非空 |
gorm:"type:varchar(64)" |
设置字段为varchar类型,长度为64 |
gorm:"column:remark" |
设置数据库字段名为remark |
gorm:"-" |
忽略此字段,不在表中创建该字段 |
gorm:"default:'默认'" |
设置字段的默认值 |
3.2 迁移建表
AutoMigrate 用于自动迁移schema,保持schema 是最新的。
db.AutoMigrate(&UserInfo{})
注:在gorm中,表名创建是以复数存在的插入,创建表名为user_infos
3.3 创建记录
u1 := UserInfo{1, "王武", 17, "男", "篮球"}
u2 := UserInfo{2, "张佳", 15, "女", "乒乓"}
u3 := UserInfo{3, "李白", 16, "男", "足球"}
db.Create(&u1)
db.Create(&u2)
db.Create(&u3)
3.4 查询
// First查询第一条记录
var u = new(UserInf)
db.First(u)
fmt.Printf("%d, %d, %s, %s, %s\n", u.ID, u.UserId, u.Name,u.Sex,u.Hobby)
//Find查询 ID=2
var uu UserInf
db.Find(&uu,2)
fmt.Printf("%d, %d, %s, %s, %s\n\n", uu.ID, uu.UserId,uu.Name,uu.Sex,uu.Hobby)
//查询多个记录
var users []UserInf = make([]UserInf, 3)
db.Where("user_id > ?", 0).Order("ID").Find(&users)
for _,user := range users {
fmt.Printf("%d, %d, %s, %d, %s, %s\n", user.ID, user.UserId,user.Name,user.Age, user.Sex,user.Hobby)
}
3.5 更新
// Update更新
var u = new(UserInf)
db.Model(&u).Update("hobby", "双色球")
// Save更新所有字段
u.Hobby = "篮球"
u.Age = 20
db.Save(&u)
3.6 删除
//单个结构删除
db.Delete(&u)
//批量删除
db.Where("ID>=?",0).Delete(UserInf{})