使用 GORM操作数据库 | 青训营

43 阅读3分钟

首先,我们要确保自己的电脑上已经安装了GORM库。如果还没有安装可以可以使用以下命令进行安装:

go get -u ![]()gorm.io/gorm  
go get -u ![]()gorm.io/driver/mysql  

接下来,以使用MySQL数据库作为示例。首先,我们需要创建一个数据库连接。

import (  
    "![]()gorm.io/gorm"  
    "![]()gorm.io/driver/mysql"  
)  
  
func ConnectDB() (*gorm.DB, error) {  
    dsn := "username:password@tcp(localhost:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"  
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})  
    if err != nil {  
        return nil, err  
    }  
      
    return db, nil  
}  

在实际的操作过程当中,需要将上述代码中的usernamepassworddatabase_name替换为我们自己的数据库的实际信息。

通过上述操作,我们就可以成功连接到自己的数据库,接下来我们可以通过相应的语法来实现对数据的增删改查操作,下面将相应的增删改查操作定义为一个个的方法。

1. 增加数据:

type User struct {  
    ID   uint  
    Name string  
    Age  int  
}  
  
func CreateUser(db *gorm.DB, user *User) error {  
    result := db.Create(user)  
    if result.Error != nil {  
        return result.Error  
    }  
      
    return nil  
}  

2. 查询数据:

func GetUserByID(db *gorm.DB, id uint) (*User, error) {  
    var user User  
    result := db.First(&user, id)  
    if result.Error != nil {  
        return nil, result.Error  
    }  
      
    return &user, nil  
}  

3. 更新数据:

func UpdateUser(db *gorm.DB, user *User) error {  
    result := db.Save(user)  
    if result.Error != nil {  
        return result.Error  
    }  
      
    return nil  
}  

4. 删除数据:

func DeleteUser(db *gorm.DB, id uint) error {  
    result := db.Delete(&User{}, id)  
    if result.Error != nil {  
        return result.Error  
    }  
      
    return nil  
}  

为了操作的便捷性与实用性,我们可以在应用程序中使用这些函数来实现对数据库的增删改查操作。

func main() {  
    db, err := ConnectDB()  
    if err != nil {  
        log.Fatal(err)  
    }  
    defer db.Close()  
      
    // 创建用户  
    user := &User{Name: "John", Age: 25}  
    err = CreateUser(db, user)  
    if err != nil {  
        log.Fatal(err)  
    }  
      
    // 查询用户  
    retrievedUser, err := GetUserByID(db, ![]()user.ID)  
    if err != nil {  
        log.Fatal(err)  
    }  
    fmt.Println(retrievedUser)  
      
    // 更新用户  
    retrievedUser.Age = 30  
    err = UpdateUser(db, retrievedUser)  
    if err != nil {  
        log.Fatal(err)  
    }  
      
    // 删除用户  
    err = DeleteUser(db, ![]()retrievedUser.ID)  
    if err != nil {  
        log.Fatal(err)  
    }  
}  

以上是使用GORM连接数据库,并实现基础的增删改查操作的具体实现过程。

需要注意的是,除了使用First方法查询单个记录外,还可以使用Find方法查询多个记录。例如,查询所有年龄大于等于18岁的用户:

func GetAdultUsers(db *gorm.DB) ([]User, error) {  
    var users []User  
    result := db.Where("age >= ?"18).Find(&users)  
    if result.Error != nil {  
        return nil, result.Error  
    }  
      
    return users, nil  
}  

除此之外,我们还可以使用Order方法对查询结果进行排序,使用LimitOffset方法进行分页查询等。

2. 关联查询:

GORM支持通过关联表进行查询,例如,查询用户及其关联的文章:

type Article struct {  
    ID     uint  
    Title  string  
    UserID uint  
}  
  
func GetUserWithArticles(db *gorm.DB, userID uint) (*User, error) {  
    var user User  
    result := db.Preload("Articles").First(&user, userID)  
    if result.Error != nil {  
        return nil, result.Error  
    }  
      
    return &user, nil  
}  

在上面的例子中,我们使用Preload方法预加载了用户的文章,以避免N+1查询问题。

3. 数据验证和约束:

GORM提供了丰富的数据验证和约束功能,可以帮助我们确保数据的完整性和一致性。我们可以在模型结构体中使用标签来定义验证规则和约束条件。例如,限制用户名的最大长度为50个字符:

type User struct {  
    ID   uint  
    Name string `gorm:"size:50"`  
    Age  int  
}  

除此之外,我们也可以使用钩子函数来在保存、更新或删除数据之前或之后执行自定义的操作。

4. 事务处理:

GORM支持事务处理,以确保数据库操作的原子性和一致性。在开发的过程当中,我们可以使用Begin方法开始一个事务,并使用CommitRollback方法来提交或回滚事务。

func TransferFunds(db *gorm.DB, fromAccountID, toAccountID uint, amount float64) error {  
    tx := db.Begin()  
      
    // 扣除转出账户的金额  
    err := tx.Model(&Account{}).Where("id = ?", fromAccountID).Update("balance", gorm.Expr("balance - ?", amount)).Error  
    if err != nil {  
        tx.Rollback()  
        return err  
    }  
      
    // 增加转入账户的金额  
    err = tx.Model(&Account{}).Where("id = ?", toAccountID).Update("balance", gorm.Expr("balance + ?", amount)).Error  
    if err != nil {  
        tx.Rollback()  
        return err  
    }  
      
    // 提交事务  
    err = tx.Commit().Error  
    if err != nil {  
        tx.Rollback()  
        return err  
    }  
      
    return nil  
}  

以上只是GORM提供的一些常用功能和特性的分析,在今后的实际开发过程当中,我们可以根据自己的需求和业务逻辑进行更多的拓展和定制。