Go语言Gorm框架基础知识代码示例(2) | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

本文承接上文,此处记录Gorm的修改,删除与原生SQL的某些用法

项目结构添加如下,只需要main下额外添加一个文件即可

image.png

m2代码如下

package main

import (
   "Gorm1/model"
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

func conn() *gorm.DB {
   dsn := "root:root@tcp(localhost:3306)/userLogin"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

   if err != nil {
      fmt.Println("Connection ERROR!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
      return nil
   }
   return db
}

func main() {

   var db *gorm.DB = conn()

   //Save更新
   /**


   var user1 model.Users

   db.Debug().Where("userName", nil).First(&user1)
   user1.UserPassword = "NULL"
   //查询不到则会插入新数据
   // UPDATE `users` SET `userName`='',`userPassword`='NULL',`createAt`='0000-00-00 00:00:00' WHERE `userId` = 18
   db.Debug().Save(&user1)
   */

   //var user2 model.Users
   //update更新
   /**
   //无对应数据时则不会插入
   // UPDATE `users` SET `userName`='ffff' WHERE `userPassword` = 'fffff'
   db.Debug().Model(&user2).Where("userPassword", "fffff").Update("userName", "ffff")
   var user1 model.Users = model.Users{}
   //UPDATE `users` SET `userPassword`='ttttt' WHERE `userName` = 'ttt'
   db.Debug().Model(&user1).Where("userName", "ttt").Update("userPassword", "ttttt")
   */

   //updates更新多列
   //更新多个,gorm文档与我实际不同,因为我没指定主键
   // gorm文档没加where条件,我不加where条件则sql语句是 UPDATE `users` SET `userName`='XXXX',`userPassword`='XXXX'报错
   // UPDATE `users` SET `userName`='first2',`userPassword`='second' WHERE `UserName` = 'first'
   //有返回值result,可以读取操作的数目
   /**
   db.Debug().Model(&user2).Where("UserName", "first2").Updates(&model.Users{
      UserName:     "first",
      UserPassword: "first",
      CreatedAt:    time.Time{},
   })

   */

   /**
   //delete删除
   user2.ID = 49
   user2.UserName = "first2"
   // DELETE FROM `users` WHERE `users`.`userId` = 48
   //也可以加where条件
   db.Debug().Delete(&user2)

   */

   //原生SQL
   //原生SQL好用很多,简单的API加上原生SQL即可实现很多功能
   var user2 []model.Users
   //var user3 []model.Users
   //Select * from `users` where userName='first'
   //只拿来查询
   db.Debug().Raw("Select * from `users` where userName=?", "first").Scan(&user2)
   fmt.Println(user2)
   result := db.Debug().Exec("Update `users` set userPassword=? where userName=?", "aaaaa", "aaaa")
   fmt.Println(result.RowsAffected)

   //Rows的遍历
   var userName, userPassword string
   row, err := db.Debug().Raw("Select userName,userPassword from `users` where userName=?", "aaaa").Rows()
   if err != nil {
      fmt.Println("ERROR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
      fmt.Println(err)
      return
   }
   //推迟row的关闭
   defer row.Close()
   for row.Next() {
      row.Scan(&userName, &userPassword)
      fmt.Println(userName)
   }
   row.Close()

   //Row的遍历,只有第一项
   row2 := db.Debug().Raw("Select userName,userPassword from `users` where userName=?", "aaaa").Row()
   row2.Scan(&userName, &userPassword)
   fmt.Println(userName)
}

原生SQL是万能的,功能覆盖广阔

回头研究下连接池