0
点赞
收藏
分享

微信扫一扫

GORM框架基础学习

洲行 2022-03-25 阅读 81

连接MySQL基本实例

package main

import (
   "fmt"
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)

// UserInfo 用户信息
type UserInfo struct {
   ID uint
   Name string
   Gender string
   Hobby string
}


func main() {
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()

   //自动迁移    自己现在SQLyog里创建一个db1的数据库
   db.AutoMigrate(&UserInfo{})

   u1 := UserInfo{1, "闫佳鹏", "男", "篮球"}
   u2 := UserInfo{2, "沙河娜扎", "女", "足球"}
   // 创建记录
   db.Create(&u1)
   db.Create(&u2)
   //查询
   var u = new(UserInfo)
   db.First(u)  //查询表中第一行的数据
   fmt.Printf("%#v\n", u)

   var uu UserInfo
   //找到表中hobby是足球的那一行数据
   db.Find(&uu, "hobby=?", "足球")  
   fmt.Printf("%#v\n", uu)

   // 更新
   db.Model(&u).Update("hobby", "双色球")//将上面查询的第一行数据中的hobby改为双色球
   // 删除
   db.Delete(&u)  //删除查询出的第一行数据
}

GORM模型定义示例

package main

import (
   "database/sql"
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
   "time"
)
//定义模板
type User struct {
   gorm.Model  //内嵌gorm.Moderl
   Name         string
   Age          sql.NullInt64  //零值类型
   Birthday     *time.Time
   Email        string  `gorm:"type:varchar(100);unique_index"`
   Role         string  `gorm:"size:255"` // 设置字段大小为255
   MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
   Num          int     `gorm:"AUTO_INCREMENT"` // 设置 num 为自增类型
   Address      string  `gorm:"index:addr"` // 给address字段创建名为addr的索引
   IgnoreMe     int     `gorm:"-"` // 忽略本字段
}


func main() {
   //连接MySQL数据库
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()

   db.AutoMigrate(&User{})


}

主键、表名、列名的约定

主键

GORM 默认会使用名为ID的字段作为表的主键。

package main

import (
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
   ID   string // 名为`ID`的字段会默认作为表的主键
   Name string
}

// 使用`AnimalID`作为主键
type Animal struct {
   AnimalID int64 `gorm:"primary_key"`
   Name     string
   Age      int64
}

func main() {
   //连接MySQL数据库
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()


   db.AutoMigrate(&User{})
   db.AutoMigrate(&Animal{})

}

表名

package main

import (
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)


// 使用`AnimalID`作为主键
type Animal struct {
   AnimalID int64 `gorm:"primary_key"`
   Name     string
   Age      int64
}

//将表名字设置为dongwu  但是在下面迁移会保证数据的安全所以会重新创建一个表
func (Animal) TableName() string  {
   return "dongwu"
}

func main() {
   //连接MySQL数据库
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()


   db.AutoMigrate(&Animal{})

}

禁用默认表名的复数形式

// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`
db.SingularTable(true)

Table()指定表名:

// 使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})
package main

import (
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)


// 使用`AnimalID`作为主键
type Animal struct {
   AnimalID int64 `gorm:"primary_key"`
   Name     string
   Age      int64
}


func main() {
   //连接MySQL数据库
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()

   
   // 使用Animal结构体创建名为`deleted_Animal`的表
   db.Table("deleted_Animal").CreateTable(&Animal{})

}

GORM还支持更改默认表名称规则:

package main

import (
   _ "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)


// 使用`AnimalID`作为主键
type Animal struct {
   AnimalID int64 `gorm:"primary_key"`
   Name     string
   Age      int64
}


func main() {

   gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
      return "xxx_" + defaultTableName;
   }

   //连接MySQL数据库
   db, err := gorm.Open("mysql", "root:123456@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
   if err!= nil{
      panic(err)
   }
   defer db.Close()

   db.AutoMigrate(&Animal{})

}

列名

列名由字段名称进行下划线分割来生成

type User struct {
  ID        uint      // column name is `id`
  Name      string    // column name is `name`
  Birthday  time.Time // column name is `birthday`
  CreatedAt time.Time // column name is `created_at`
}

可以使用结构体tag指定列名:

格式:

type Animal struct {
  AnimalId    int64     `gorm:"column:beast_id"`         // set column name to `beast_id`
  Birthday    time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`
  Age         int64     `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}

时间戳跟踪

CreatedAt

如果模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。

db.Create(&user) // `CreatedAt`将会是当前时间

// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())

UpdatedAt

如果模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。

db.Save(&user) // `UpdatedAt`将会是当前时间

db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间

DeletedAt

如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,而不是直接将记录从数据库中删除。

举报

相关推荐

0 条评论