gorm的简单使用

记录一下自己的学习过程,顺带水一篇文章

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
})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值