gorm连接数据库
package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm")func main() {dsn := "root:root@tcp(192.168.4.111:3306)/mytest?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("err", err)}fmt.Println("db", db)}
设置全局logger, 让gorm打印执行的sql语句
func main() {dsn := "root:root@tcp(192.168.4.111:3306)/mytest?charset=utf8mb4&parseTime=True&loc=Local"newLogger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)logger.Config{SlowThreshold: time.Second, // 慢 SQL 阈值LogLevel: logger.Info, // 日志级别Colorful: false, // 禁用彩色打印},)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger,})if err != nil {fmt.Println("err", err)}fmt.Println("db", db)}
定义表结构, 将表结构直接生成表
定义表结构
type Product struct {gorm.ModelCode stringPrice uint}
生成表
执行: db.AutoMigrate_(_&Product_{})_
然后我们看到数据库里面相应的表就生成了
可以看到执行了以下sql语句
快速体验增删查改
// 1.Createdb.Create(&Product{Code: "D42", Price: 100})// 2.Readvar product Productdb.First(&product, 2) // 根据整形主键查找db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录fmt.Printf("product: %v \n", product)// 3.Update - 将 product 的 price 更新为 200db.Model(&product).Update("Price", 300)// Update - 更新多个字段db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})// 4.Delete - 删除 productdb.Delete(&product, 1)
通过NullString解决不能更新零值的问题
使用sql.NullString(如果创建表的时候没有使用sql.NullString来定义字段, 后期也是可以修改结构体来达到修改零值的目的的)
// 定义type User struct {ID uintName sql.NullStringEmail *stringAge uint8Birthday *time.TimeMemberNumber sql.NullStringActivatedAt sql.NullTimeCreatedAt time.TimeUpdatedAt time.Time}// 修改var user Userdb.First(&user, 1)db.Model(&user).Updates(User{Name: sql.NullString{String: "",Valid: true,},Age: 0,})
使用指针定义字段Email *string
定义表结构
type UserDefine struct {UserID uint `gorm:"primaryKey"`// Name string `gorm:"column:user_name;type:varchar(50);index:ide_user_name"`Name string `gorm:"column:user_name;type:varchar(50);index:ide_user_name;unique;default:'bobby'"`}
新增数据
// 新增数据t := time.Now()var user = &User{Name: "Anderson",Age: 25,Birthday: &t,}res := db.Create(&user)fmt.Println("user.ID", user.ID) // 返回插入后数据库IDfmt.Println("res.Error", res.Error) // 执行出错错误会在这里显示fmt.Println("res.RowsAffected", res.RowsAffected) // 影响的行数
更新数据
// 更新单个字段db.Model(&User{ID: 1}).Update("age", 22)// 更新多个字段email := "741883227@qq.com"db.Model(&User{ID: 1}).Updates(&User{Age: 18,Email: &email,})
查询数据
first(主键升序)
// 通过first查询单条数据var user Userres := db.First(&user)fmt.Println("user", user)fmt.Println("res.Error", res.Error)fmt.Println("res.RowsAffected", res.RowsAffected)
