gorm是一个很棒的go语言orm库
简单使用
go get -u gorm.io/gormgo get -u gorm.io/driver/sqlitego 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.ModelName stringAge int}// 指定表名(默认: 结构体名复数命名)func (*User) TableName() string {return "user"}
orm := CreateOrm()orm.AutoMigrate(&User{})
u := User{Name: "admin",Age: 18,}orm.Save(&u)
var u Userorm.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 uintUserInfo UserInfo `gorm:"embedded"`}type UserInfo struct {Reaname string}
构建SQL
var result []Usersql := `select *from user`// 执行SQL并返回值(如果不加Scan函数则不执行)db.Raw(sql).Scan(&result)// 仅执行SQLdb.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)
