这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记
- database/SQL
- 基本用法
import( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main(){ // 使用driver+DSN初始化DB连接 db, err := sql.Open("mysql","user:password@tcp(127.0.0.1:3306)/hello") // 写法2 connector, err := mysql.NewConnector(&mysql.Config{ User: "gorm", Passwd: "gorm", Net:"tcp", Addr:"127.0.0.1:3306", DBName:"gorm", ParseTime:true, }) db := sql.OpenDB(connector) // 执行sql语句,通过rows取出返回的数据 rows, err := db.Query("select id, name from users where id = ?",1) if err != nil{} defer rows.Close() // 处理数据 var users []User for rows.Next(){ var user User err := rows.Scan(&user.ID,&user.Name) if err != nil{} users = append(users,user) } if rows.Err() != nil{} }- 设计原理
- DB连接类型
- 直接连接/Conn
- 预编译/Stmt
- 事物/Tx
- 返回处理数据方式
- Exec/ExecContext->Result
- Query/QueryContext->Rows(Columns)
- QueryRow/QueryRowContext->Row(Rows简化)
- DB连接类型
- GORM简单使用
import( "gorm.io/gorm" "gorm.io/driver/mysql" ) func main(){ db, err := gorm.Open( mysql.Open("user:password@tcp(127.0.0.1:3306)/hello") ) var users []User err = db.Select("id","name").Find(&users,1).Error }- 基础用法:CRUD
//操作数据库 db.AutoMigrate(&Product{}) db.Migrator().CreateTable(&Product{}) //创建 user := User{Name:"name",Age:18} result := db.Create(&user) //批量创建 var users = []User{{Name:"name1"},{Name:"name2"}} db.Ceate(&users) db.CreateInBatches(users,100) //读取 var product Product db.First(&product,1) //查询id为1的product db.First(&product, "code=?","L1212") //查询code为L1212的product result := db.Find(&users, []int{1,2,3}) result.RowsAffected //返回找到的记录数 errors.Is(result.Error,gorm.ErrRecordNotFount) //更新字段 db.Model(&product).Update("Price",2000) db.Model(&product).UpdateColumn("Price",2000) //更新多个字段 db.Model(&product).Update(Product{Price:2000,code:"L1212"}) db.Model(&product).Updates(map[string]interface{}{"Price":2000,"Code":"L1212}) //批量更新 db.Model(&Product{}).Where("price<?",2000).Updates(map[string]interface{}{"Price":2000}) //删除 db.Delete(&product)- 模型定义原则
- 表名为struct name的snake_cases复数形式
- 字段名为field name的snake_cases单数形式
- ID字段为主键,如果为数字,则为自增主键
- CreatedAt字段,创建时,保存当前时间
- UpdatedAt字段,创建、更新时,保存当前时间
- gorm.DeletedAt字段,默认开启soft delete模式 **Gorm具体使用方式见(GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.)
- GORM设计原理
- SQL生成
db.Where("role<>?","manager").Where("age>?",35).Limit(100).Order("age desc").Find(&user) - 插件扩展
- ConnPool
- Dialector
- SQL生成
- 这节课感觉云里雾里,感觉什么都是浅尝即止,不成体系