这是我参与第五届青训营笔记创作活动的第5天
package main
import (
"database/sql"
"fmt"
)
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/hello")
rows, err := db.Query("select * from users where id = ?", 1)
if err != nil {
fmt.Printf("err: %v\n", err)
}
defer func() {
err = rows.Close()
}
var users []User
for rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Name)
if err != nil {
fmt.Printf("err: %v\n", err)
}
users = append(users, user)
}
if rows.Err() != nil {
fmt.Printf("rows.Err(): %v\n", rows.Err())
}
}
- 设计原则:API精简、测试优先、最小惊讶、灵活扩展、无依赖、可信赖
- 功能完善:
> 1. 关联:一对一、一对多、单表自关联、多态:Preload、Joins 预加载、级联删除;关联模式:自定义关联表
> 2. 事务:事务代码块、嵌套事务、Save Point
> 3. 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
> 3. 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动track时间、SQL Builder、Logger
> 4. 代码生成、符合主键、Constraint、Prometheus、Auto Migration、真跨数据库兼容
> 5. 多模式灵活自由扩展
> 6. Developer Friendly
db.AutoMigrate(&Product{})
db.Migrator().CreateTable(&Product{})
user := User{Name: "test", Name: "test"}
result := db.Create(&user)
var users = []User{{Name: "test"}, {Name: "test"}}
db.Create(&users)
db.CreateInBatches(users, 100)
for _, user := range users {
fmt.Printf(user.ID)
}
var product Product
db.First(&product, 1)
db.First(&product, "code = ?", 1)
result := db.Find(&users, []int{1, 2, 3})
result.RowsAffected
errors.Is(result.Error, gorm.ErrRecordNotFound)
db.Model(&product).Update("Price", 2000)
db.Model(&product).UpdateColumn("Price", 2000)
db.Model(&product).Updates(product{Price: 2000, Code: "code"})
db.Model(&product).Updates(map[string]interface{}{"Price": 2000, Code: "code"})
db.Model(&product{}).Where("price < ?", 2000).Updates(map[string]interface{}{"Price": 2000})
db.Delete(&product)
- 表名为struct name 的snake_cases复数格式
- 字段名为field name的snake_case单数格式
- ID / Id字段为主键,如果为数字,则为自增主键
- CreatedAt 字段,创建时,保存当前时间
- UpdatedAt 字段,创建、更新时,保存当前时间
- gorm.DeletedAt 字段,默认开启soft delete 模式