gorm连接数据库

  1. package main
  2. import (
  3. "fmt"
  4. "gorm.io/driver/mysql"
  5. "gorm.io/gorm"
  6. )
  7. func main() {
  8. dsn := "root:root@tcp(192.168.4.111:3306)/mytest?charset=utf8mb4&parseTime=True&loc=Local"
  9. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  10. if err != nil {
  11. fmt.Println("err", err)
  12. }
  13. fmt.Println("db", db)
  14. }

设置全局logger, 让gorm打印执行的sql语句

  1. func main() {
  2. dsn := "root:root@tcp(192.168.4.111:3306)/mytest?charset=utf8mb4&parseTime=True&loc=Local"
  3. newLogger := logger.New(
  4. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
  5. logger.Config{
  6. SlowThreshold: time.Second, // 慢 SQL 阈值
  7. LogLevel: logger.Info, // 日志级别
  8. Colorful: false, // 禁用彩色打印
  9. },
  10. )
  11. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  12. Logger: newLogger,
  13. })
  14. if err != nil {
  15. fmt.Println("err", err)
  16. }
  17. fmt.Println("db", db)
  18. }

定义表结构, 将表结构直接生成表

定义表结构

  1. type Product struct {
  2. gorm.Model
  3. Code string
  4. Price uint
  5. }

生成表

执行: db.AutoMigrate_(_&Product_{})_
然后我们看到数据库里面相应的表就生成了
image.png
可以看到执行了以下sql语句
image.png

快速体验增删查改

  1. // 1.Create
  2. db.Create(&Product{Code: "D42", Price: 100})
  3. // 2.Read
  4. var product Product
  5. db.First(&product, 2) // 根据整形主键查找
  6. db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
  7. fmt.Printf("product: %v \n", product)
  8. // 3.Update - 将 product 的 price 更新为 200
  9. db.Model(&product).Update("Price", 300)
  10. // Update - 更新多个字段
  11. db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
  12. db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
  13. // 4.Delete - 删除 product
  14. db.Delete(&product, 1)

通过NullString解决不能更新零值的问题

使用sql.NullString(如果创建表的时候没有使用sql.NullString来定义字段, 后期也是可以修改结构体来达到修改零值的目的的)

  1. // 定义
  2. type User struct {
  3. ID uint
  4. Name sql.NullString
  5. Email *string
  6. Age uint8
  7. Birthday *time.Time
  8. MemberNumber sql.NullString
  9. ActivatedAt sql.NullTime
  10. CreatedAt time.Time
  11. UpdatedAt time.Time
  12. }
  13. // 修改
  14. var user User
  15. db.First(&user, 1)
  16. db.Model(&user).Updates(User{
  17. Name: sql.NullString{
  18. String: "",
  19. Valid: true,
  20. },
  21. Age: 0,
  22. })

使用指针定义字段Email *string

定义表结构

  1. type UserDefine struct {
  2. UserID uint `gorm:"primaryKey"`
  3. // Name string `gorm:"column:user_name;type:varchar(50);index:ide_user_name"`
  4. Name string `gorm:"column:user_name;type:varchar(50);index:ide_user_name;unique;default:'bobby'"`
  5. }

新增数据

  1. // 新增数据
  2. t := time.Now()
  3. var user = &User{
  4. Name: "Anderson",
  5. Age: 25,
  6. Birthday: &t,
  7. }
  8. res := db.Create(&user)
  9. fmt.Println("user.ID", user.ID) // 返回插入后数据库ID
  10. fmt.Println("res.Error", res.Error) // 执行出错错误会在这里显示
  11. fmt.Println("res.RowsAffected", res.RowsAffected) // 影响的行数

更新数据

  1. // 更新单个字段
  2. db.Model(&User{ID: 1}).Update("age", 22)
  3. // 更新多个字段
  4. email := "741883227@qq.com"
  5. db.Model(&User{ID: 1}).Updates(&User{
  6. Age: 18,
  7. Email: &email,
  8. })

查询数据

first(主键升序)

  1. // 通过first查询单条数据
  2. var user User
  3. res := db.First(&user)
  4. fmt.Println("user", user)
  5. fmt.Println("res.Error", res.Error)
  6. fmt.Println("res.RowsAffected", res.RowsAffected)

take(和first用法一致, 只是没有排序)

last(和first用法一致, 排序是主键降序)