事务
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true, // 一般不禁用
})
大约 2 分钟
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true, // 一般不禁用
})
一对一关系比较少,一般用于表的扩展
例如一张用户表,有很多字段
那么就可以把它拆分为两张表,常用的字段放主表,不常用的字段放详情表
type User struct {
ID uint
Name string
Age int
Gender bool
UserInfo UserInfo // 通过UserInfo可以拿到用户详情信息
}
type UserInfo struct {
UserID uint // 外键
ID uint
Addr string
Like string
}
func main(){
DB.AutoMigrate(&User{}, UserInfo{})
}
连接初始化
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var Db *gorm.DB
var mySqlLogger logger.Interface
func init() {
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm" //数据库名
timeout := "10s" //连接超时,10秒
mySqlLogger = logger.Default.LogMode(logger.Info)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// 日志配置
Logger: mySqlLogger,
})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
Db = db
}
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
var mySqlLogger logger.Interface
func init() {
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm" //数据库名
timeout := "10s" //连接超时,10秒
mySqlLogger = logger.Default.LogMode(logger.Info)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// 日志配置
Logger: mySqlLogger,
})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
DB = db
}
定义一张表
type Student struct {
ID uint // 默认使用ID作为主键
Name string
Email *string // 使用指针是为了存空值
}
ORM 是 Object Relational Mapping 的缩写,译为“对象关系映射”,它解决了对象和关系型数据库之间的数据交互问题。
简单说就是 使用一个类表示一张表,类中的属性表示表的字段,类的实例化对象表示一条记录使用对象的方法操作数据库。
和自动生成 SQL语句相比,手动编写 SQL语句的缺点是非常明显的,主要体现在以下两个方面:
路由分组, 将一类api分为一组, 可以在这个组加统一的中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func UserView(c *gin.Context) {
path := c.Request.URL
fmt.Println(c.Request.Method, path)
}
func main() {
r := gin.Default()
apiGroup := r.Group("api")
// apiGroup.Use() 加中间件
UserGroup(apiGroup)
r.Run(":8080")
}
func UserGroup(r *gin.RouterGroup) {
r.GET("users", UserView)
r.POST("users", UserView)
r.PUT("users", UserView)
r.DELETE("users", UserView)
}
使用binding可以很好的完成参数的绑定
r.GET("", func(c *gin.Context) {
type User struct {
Name string `form:"name"`
Age int `form:"age"`
}
var user User
err := c.ShouldBindQuery(&user)
fmt.Println(user, err)
})