我的青训营笔记5-GORM操纵数据库| 青训营

60 阅读4分钟

1. 什么是GORM

GORM是使用广泛的Go语言ORM(对象关系映射)库,它为Go语言提供了一个简单而强大的数据库操作工具。作为ORM库,GORM的主要目标是实现对象和数据库之间的映射关系,使得我们可以通过操作对象来进行数据库的增删改查等操作,而无需直接编写SQL语句。

GORM在Go语言中被广泛应用,它支持多种主流的数据库,如MySQL、PostgreSQL、SQLite等。使用GORM,可以轻松地定义数据模型(结构体),并利用GORM提供的API进行数据库的各种操作,如创建表、插入数据、查询数据、更新数据和删除数据等。

在本次青训营大作业中,我们的项目使用GORM作为ORM,完成与数据库的连接、CRUD操作。

2. GORM连接数据库

【注意】 建议将数据库信息放置在单独的config文件中,并设置gitignore!

  • 使用GORM的Open函数来建立与数据库的连接。

    该函数接受两个参数:数据库类型和连接字符串。连接字符串包含数据库的连接信息,如用户名、密码、主机名、端口号和数据库名称等。

    以MySQL为例,连接字符串的格式如下:

    dsn := "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local"
    
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    

    其中,"user"、"password"、"host"、"port"和"database"分别表示数据库的用户、密码、主机名、端口和数据库名。

  • 配置数据库连接池(可选) 可以根据需要配置数据库连接池的参数,如最大连接数、最大空闲连接数等。你可以通过GORM的DB方法获取底层的*sql.DB对象,然后使用其方法来配置连接池。

    例如,设置最大连接数和最大空闲连接数:

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB, err := db.DB()
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetMaxIdleConns(10)
    
  • 测试连接 为了确保成功建立数据库连接,可以使用GORM的DB方法获取底层的*sql.DB对象,并调用其Ping方法来测试连接。

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB, err := db.DB()
    err = sqlDB.Ping()
    if err != nil {
        // 连接失败处理
    }
    
  • 关闭数据库连接 在程序退出前,应该关闭数据库连接,以释放资源。可以使用GORM的DB方法获取底层的*sql.DB对象,并调用其Close方法来关闭连接。

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB, err := db.DB()
    defer sqlDB.Close()
    

3. GORM数据库操作

一般情况下,应该在Model层定义数据映射的实体类,并适当地添加GORM字段,这样GORM可以自动加载模型并映射到数据库中。

  • 数据模型

在GORM中,我们可以通过定义Go结构体来映射数据库表。通过在结构体上使用GORM的标签(tag),我们可以指定表名、字段名、主键、索引等。 下面的代码定义了一个User结构体,映射为User表:

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"column:name"`
    Age  int    `gorm:"column:age"`
}

使用AutoMigrate方法可以根据结构体定义自动创建表:

db.AutoMigrate(&User{})
  • CRUD
  1. 插入数据:
    使用GORM的Create方法可以向数据库插入新的数据。

    例如,插入一条新的用户记录:

    user := User{Name: "John", Age: 25}
    db.Create(&user)
    
  2. 查询数据:

    GORM提供了多种查询方式,可以根据条件查询数据。

    例如,查询所有用户记录:

    var users []User
    db.Find(&users)
    

    根据条件查询单个用户记录:

    var user User
    db.Where("name = ?", "John").First(&user)
    
  3. 更新数据:
    使用GORM的Save方法可以更新数据库中的数据。

    例如,更新用户的年龄:

    var user User
    db.First(&user)
    user.Age = 30
    db.Save(&user)
    
  4. 删除数据:
    使用GORM的Delete方法可以从数据库中删除数据。

    例如,根据条件删除用户记录:

    db.Where("age > ?", 30).Delete(&User{})
    

4. 链式操作和Raw SQL

  • 链式操作

    GORM提供了丰富的链式操作方法,可以在查询过程中逐步添加条件、排序规则和限制条件等。这种方式使得查询语句更加清晰和易于构建。

    例如,根据条件查询年龄大于等于18且性别为男性的用户记录: 在链式操作中,我们可以使用Where方法添加查询条件,Order方法指定排序规则,LimitOffset方法进行分页查询等。

    var users []User
    db.Where("age >= ?", 18).Where("gender = ?", "male").Find(&users)
    
  • Raw SQL

    GORM的Raw方法提供了使用原始SQL语句的功能,这在某些复杂的查询场景下非常有用。通过使用Raw方法,我们可以直接执行自定义的SQL语句,并将结果映射到Go结构体中。

    例如,执行原始SQL查询并将结果映射到User结构体:

    var users []User
    db.Raw("SELECT * FROM users WHERE age >= ? AND gender = ?", 18, "male").Scan(&users)
    

    【注意】 使用Raw SQL时,需要注意保护好应用程序免受SQL注入攻击。可以使用参数绑定(placeholder)和预编译语句等技术来确保执行的SQL语句安全可靠。