gorm是一个很棒的go语言orm

简单使用

  1. go get -u gorm.io/gorm
  2. go get -u gorm.io/driver/sqlite
  3. go get -u gorm.io/driver/mysql
  1. import (
  2. "gorm.io/driver/sqlite"
  3. "gorm.io/gorm"
  4. )
  5. func CreateOrm() (db *gorm.DB) {
  6. dsn := "learn_gorm.db"
  7. db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
  8. if err != nil {
  9. log.Fatalln(err.Error())
  10. }
  11. return
  12. }
  1. import "gorm.io/gorm"
  2. type User struct {
  3. gorm.Model
  4. Name string
  5. Age int
  6. }
  7. // 指定表名(默认: 结构体名复数命名)
  8. func (*User) TableName() string {
  9. return "user"
  10. }
  1. orm := CreateOrm()
  2. orm.AutoMigrate(&User{})
  1. u := User{
  2. Name: "admin",
  3. Age: 18,
  4. }
  5. orm.Save(&u)
  1. var u User
  2. orm.Model(&User{}).Where("name", "admin_new").Scan(&u)
  3. fmt.Printf("%+v\n", u)
  1. // 先通过Where方法查询,然后通过Update修改指定字段
  2. orm.Model(&User{}).Where("name", "admin").Update("name", "admin_new")
  1. orm.Where("name", "admin_new").Delete(&User{})

数据模型


  1. // 修改后通过AutoMigrate同步模型至数据库
  2. type User struct {
  3. ID uint `gorm:"primaryKey"` // 设置主键
  4. ID uint `gorm:"primaryKey;autoIncrement"` // 设置主键,并自增
  5. Name string `gorm:"index"` // 设置索引
  6. Name string `gorm:"uniqueIndex"` // 设置唯一索引
  7. }
  1. type User struct {
  2. ClassRoom string `gorm:"column:classroom"` // 设置字段名
  3. ClassRoom string `gorm:"type:varchar(10)"` // 设置类型
  4. StudentId string `gorm:"not null"` // 设置非空
  5. }
  1. type User struct {
  2. // 以下两个字段为Gorm约定自动填充字段
  3. CreatedAt int // 在创建时会自动填充秒数时间戳
  4. UpdateAt time.Time // 在创建或者更新时会自动更新时间
  5. DeletedAt gorm.DeleteAt // 删除时自动更新
  6. // 除了使用约定字段,还可以像下面这样自定义
  7. Created int `gorm:"autoCreateTime"` // 自动创建秒级时间戳
  8. Created int `gorm:"autoCreateTime:milli"` // 自动填充纳秒级时间戳
  9. Created int `gorm:"autoCreateTime:nano"` // 自动填充纳秒级时间戳
  10. Updated int `gorm:"autoUpdateTime"` // 自动更新秒级时间戳
  11. }
  1. type User struct {
  2. ID uint
  3. UserInfo UserInfo `gorm:"embedded"`
  4. }
  5. type UserInfo struct {
  6. Reaname string
  7. }

构建SQL


  1. var result []User
  2. sql := `
  3. select *
  4. from user
  5. `
  6. // 执行SQL并返回值(如果不加Scan函数则不执行)
  7. db.Raw(sql).Scan(&result)
  8. // 仅执行SQL
  9. db.Exec(sql)
  1. sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
  2. return tx.Model(&User{}).Where("id = ?", 10).Limit(10).Find("*")
  3. })
  4. fmt.Printf("sql: %s\n", sql)