后端与 Golang | 青训营笔记

134 阅读2分钟

这是我参与第五届青训营笔记创作活动的第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 模式