这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
特性
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload、Joins的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
连接数据库
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:password@123@tcp(123.249.111.0:3306)/gorm_class?charset=utf8mb4&parseTime=True&loc=Local",
DefaultStringSize: 171,
}), &gorm.Config{
SkipDefaultTransaction: false,
NamingStrategy: schema.NamingStrategy{
TablePrefix: "gov_", // table name prefix, table for `User` would be `t_users`
SingularTable: true, // use singular table name, table for `User` would be `user` with this option enable
},
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
log.Println(err)
}
设置连接池
sqlDB, err := db.DB()
sqlDB.SetMaxIdleConns(10) //最大的空闲连接数
sqlDB.SetMaxOpenConns(100) //连接池最大连接数量
sqlDB.SetConnMaxLifetime(time.Hour) //连接池中链接的最大可复用时间
M := db.Migrator()
sql操作
创建表
M := db.Migrator()
M.CreateTable(&User{})
查询数据
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error or nil
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
插入数据
//批量插入
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} db.Create(&users)
删除数据
// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
总结
这次总结了gorm的一些基础操作,在之后的应用中遇到不会的还是得多查询文档,文档地址:GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.