gorm连接数据库
package main
import (
"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.Model
Code string
Price uint
}
生成表
执行: db.AutoMigrate_(_&Product_{})_
然后我们看到数据库里面相应的表就生成了
可以看到执行了以下sql语句
快速体验增删查改
// 1.Create
db.Create(&Product{Code: "D42", Price: 100})
// 2.Read
var product Product
db.First(&product, 2) // 根据整形主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
fmt.Printf("product: %v \n", product)
// 3.Update - 将 product 的 price 更新为 200
db.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 - 删除 product
db.Delete(&product, 1)
通过NullString解决不能更新零值的问题
使用sql.NullString(如果创建表的时候没有使用sql.NullString来定义字段, 后期也是可以修改结构体来达到修改零值的目的的)
// 定义
type User struct {
ID uint
Name sql.NullString
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
// 修改
var user User
db.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) // 返回插入后数据库ID
fmt.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 User
res := db.First(&user)
fmt.Println("user", user)
fmt.Println("res.Error", res.Error)
fmt.Println("res.RowsAffected", res.RowsAffected)