gorm是一个很棒的go
语言orm
库
简单使用
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
go get -u gorm.io/driver/mysql
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func CreateOrm() (db *gorm.DB) {
dsn := "learn_gorm.db"
db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalln(err.Error())
}
return
}
import "gorm.io/gorm"
type User struct {
gorm.Model
Name string
Age int
}
// 指定表名(默认: 结构体名复数命名)
func (*User) TableName() string {
return "user"
}
orm := CreateOrm()
orm.AutoMigrate(&User{})
u := User{
Name: "admin",
Age: 18,
}
orm.Save(&u)
var u User
orm.Model(&User{}).Where("name", "admin_new").Scan(&u)
fmt.Printf("%+v\n", u)
// 先通过Where方法查询,然后通过Update修改指定字段
orm.Model(&User{}).Where("name", "admin").Update("name", "admin_new")
orm.Where("name", "admin_new").Delete(&User{})
数据模型
// 修改后通过AutoMigrate同步模型至数据库
type User struct {
ID uint `gorm:"primaryKey"` // 设置主键
ID uint `gorm:"primaryKey;autoIncrement"` // 设置主键,并自增
Name string `gorm:"index"` // 设置索引
Name string `gorm:"uniqueIndex"` // 设置唯一索引
}
type User struct {
ClassRoom string `gorm:"column:classroom"` // 设置字段名
ClassRoom string `gorm:"type:varchar(10)"` // 设置类型
StudentId string `gorm:"not null"` // 设置非空
}
type User struct {
// 以下两个字段为Gorm约定自动填充字段
CreatedAt int // 在创建时会自动填充秒数时间戳
UpdateAt time.Time // 在创建或者更新时会自动更新时间
DeletedAt gorm.DeleteAt // 删除时自动更新
// 除了使用约定字段,还可以像下面这样自定义
Created int `gorm:"autoCreateTime"` // 自动创建秒级时间戳
Created int `gorm:"autoCreateTime:milli"` // 自动填充纳秒级时间戳
Created int `gorm:"autoCreateTime:nano"` // 自动填充纳秒级时间戳
Updated int `gorm:"autoUpdateTime"` // 自动更新秒级时间戳
}
type User struct {
ID uint
UserInfo UserInfo `gorm:"embedded"`
}
type UserInfo struct {
Reaname string
}
构建SQL
var result []User
sql := `
select *
from user
`
// 执行SQL并返回值(如果不加Scan函数则不执行)
db.Raw(sql).Scan(&result)
// 仅执行SQL
db.Exec(sql)
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Model(&User{}).Where("id = ?", 10).Limit(10).Find("*")
})
fmt.Printf("sql: %s\n", sql)