记录一下自己的学习过程,顺带水一篇文章
gorm使用
数据库链接以及配置
dns设置与数据库链接
dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
username,//用户名
password,//用户密码
host,//ip
port,//端口
database,//数据库名称
charset//字符集
) //使用tcp链接的dns(用于数据库链接)
db, err := gorm.Open(mysql.Open(dns), &gorm.Config{})
/*
Open的第一个参数是确定链接的数据库类型并提供相应的dns,除了mysql还有postgres、sqlite、sqlserver
第二个参数用来配置GORM的行为,比如设置数据库连接池的大小、日志级别、命名策略等
*/
连接池的配置
func (db *DB) SetConnMaxIdleTime(d time.Duration) //连接的最大空闲时间
func (db *DB) SetConnMaxLifetime(d time.Duration) //设置连接的最大生存时间
func (db *DB) SetMaxIdleConns(n int) //设置最大空闲连接数
func (db *DB) SetMaxOpenConns(n int) //设置最大打开连接数
//连接池管理
func (db *DB) Stats() DBStats
数据库操作
创建数据库表
想创建数据库,需要在go语言中创建一个相对应的结构体,以下是一个等效的例子
type User struct {
//gorm.Model 包含一些常见的字段,如ID(主键)、CreatedAt、UpdatedAt 和 DeletedAt 方便进行 CRUD 根据需求可以进行添加
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(110);not null;unique"`
}
create table Users(
id int AUTO_INCREMENT COMMENT PRIMARY KEY,
name varchar(20) not null,
telephone varchar(110) not null unique,
)
当不指定主键时,gorm会默认名为 ID 的列作为主键,且默认的表名命名为XXXs。
可以在model中使用tag进行属性指定
db.AutoMigrate(&User{}) //使用自动迁移进行表的创建
db.Exec(/*原生sql语句*/) //执行原生的 SQL 语句,适用于执行不返回行的 SQL 语句
db.Migrator() //编写自定义的迁移函数以处理特定的迁移需求
对于表的操作
db.HasTable("users") // 检查表是否存在
db.DropTable(&User{}) // 删除表
db.Model(&User{}) //修改表
增加数据
db.create(&newuser) //newuser是User的一个实例,也可以是User的一个数组来进行批量插入
db.save(&newuser) //如果存在,则更新数据;如果不存在,则插入数据
db.CreateInBatches(users, 100) //user 是一个含有大量数据的 User 数组,100的含义是每次批量插入100条数据
查询数据
类sql查询
db.Select("name, COUNT(*) as total") //选择 name 和一个计算字段 total,表示每个名字的用户数量
db.Group("name") //按名字分组
db.Order("total desc") //按 total 字段降序排序
db.Where("age > ?", 30) //选择年龄大于 30 的用户 一定要用?作为占位符,可以防止sql注入
db.Table("users") //指定操作表为users 等效于from
db.Having("COUNT(*) > ?", 1) //过滤出用户数量大于 1 的名字
db.Join("inner join / left join...on...") //同sql的join/left join
db.Limit(n) //限制返回数据,最多返回n条
提取数据
db.Find(&users) //users 是User 的一个数组,Find 可以返回多行数据
db.First(&user) //user 是User 的一个实例, First 用来返回第一条查询结果
db.First(&user,10) //返回主键为10的数据
db.Last(&user) //user 是User 的一个实例, Last 用来返回最后一条查询结果
db.Pluck("name",&names) //查询name 列的所有值,将切片返回给names
db.Rows() //返回查询到的所有结果,可以使用 range 逐行读取数据
更新数据
db.Model(&user).Update("name", "123") //user 是通过查询语句找到的需要修改的数据 db.Model(&user) 用来确定修改对象,update只能更新单个字段
db.Model(&user).Updates(map[string]interface{}{"Name": "John Updated Again", "Age": 40}) //通过传入一个map,可以同时更新多个字段
db.Save(&user) //如果存在,则更新数据;如果不存在,则插入数据
db.Model(User{}).Where("name = ?", "kdd").Update("name","dkk") //批量更新将名字为kdd的用户更新名字为dkk
删除数据
db.Delete(&user) //user 是通过查询语句找到的需要删除的数据
db.Where("name = ?", "dkk").Delete(&User{}) //批量删除名字为dkk 的所有用户
gorm中有软删除和硬删除之分
db.Unscoped().Delete(&user) //直接从数据库中移除记录
db.Delete(&user) //当模型包含 gorm.DeletedAt 字段,则delete 默认执行软删除,即在记录中标记删除时间,而不是物理删除记录
事务
tx := db.Begin() //开始事务
tx.Rollback() //回滚事务
tx.Commit() //提交事务
//自动事务
db.Transaction(func(tx *gorm.DB) error {
// 返回 nil 提交事务
return nil
})