Go笔记-day10 | 青训营

53 阅读3分钟

当使用Go语言进行数据库操作时,GORM是一个常用的ORM(对象关系映射)库。它提供了方便的API来操作数据库,并且支持多种数据库引擎。以下是一个关于使用Go和GORM进行数据库操作的简要笔记:

  1. 安装和导入GORM

    • 使用go get命令安装GORM:go get -u gorm.io/gorm
    • 导入GORM:import "gorm.io/gorm"
  2. 连接数据库

    • 使用GORM连接数据库,可以使用多种数据库引擎,如MySQL、PostgreSQL等。

    • 示例代码:

      import (
          "gorm.io/driver/mysql"
          "gorm.io/gorm"
      )
      
      func main() {
          dsn := "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
          db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
          if err != nil {
              panic("Failed to connect to database")
          }
          // ...
      }
      
  3. 定义模型和表

    • 使用结构体定义模型,每个字段对应数据库表的列。

    • 使用gorm:"column:column_name"标记字段对应的数据库列名。

    • 使用gorm:"primaryKey"标记主键字段。

    • 示例代码:

      type User struct {
          ID   uint   `gorm:"primaryKey"`
          Name string `gorm:"column:name"`
          Age  int    `gorm:"column:age"`
      }
      
  4. 创建表和迁移

    • 使用AutoMigrate方法创建表和迁移。

    • 示例代码:

      func main() {
          // ...
          err := db.AutoMigrate(&User{})
          if err != nil {
              panic("Failed to migrate")
          }
          // ...
      }
      
  5. 插入数据

    • 使用Create方法插入数据。

    • 示例代码:

      func main() {
          // ...
          user := User{Name: "John", Age: 25}
          result := db.Create(&user)
          if result.Error != nil {
              panic("Failed to insert data")
          }
          // ...
      }
      
  6. 查询数据

    • 使用Find方法查询数据。

    • 使用Where方法添加查询条件。

    • 示例代码:

      func main() {
          // ...
          var users []User
          db.Where("age > ?", 18).Find(&users)
          // ...
      }
      
  7. 更新数据

    • 使用Model方法指定要更新的模型。

    • 使用Updates方法更新数据。

    • 示例代码:

      func main() {
          // ...
          var user User
          db.Model(&user).Where("id = ?", 1).Updates(User{Name: "NewName"})
          // ...
      }
      
  8. 删除数据

    • 使用Delete方法删除数据。

    • 示例代码:

      func main() {
          // ...
          var user User
          db.Delete(&user, 1)
          // ...
      }
      

这只是一个关于使用Go和GORM进行数据库操作的简要笔记。GORM还提供了更多高级功能,如事务处理、关联关系、预加载等。 当使用GORM进行数据库操作时,可以使用其高级功能来处理事务、关联关系和预加载。以下是关于这些主题的简要笔记:

  1. 事务处理

    • 使用Begin方法开始一个事务。

    • 使用Commit方法提交事务。

    • 使用Rollback方法回滚事务。

    • 示例代码:

      func main() {
          // ...
          tx := db.Begin()
          if tx.Error != nil {
              panic("Failed to start transaction")
          }
      
          // 在事务中执行数据库操作
          // ...
      
          if err := tx.Commit().Error; err != nil {
              tx.Rollback()
              panic("Failed to commit transaction")
          }
          // ...
      }
      
  2. 关联关系

    • 使用结构体字段来定义模型之间的关联关系。

    • 使用gorm:"foreignKey:ForeignKeyColumn"标记外键列。

    • 使用gorm:"references:ReferencedModel(ReferencedColumn)"标记引用的模型和列。

    • 示例代码:

      type User struct {
          ID       uint
          Name     string
          Posts    []Post `gorm:"foreignKey:UserID"`
      }
      
      type Post struct {
          ID     uint
          UserID uint `gorm:"column:user_id"`
          Title  string
      }
      
  3. 预加载

    • 使用Preload方法预加载关联的数据。

    • 使用Find方法查询数据,并使用Preload方法指定要预加载的关联关系。

    • 示例代码:

      func main() {
          // ...
          var users []User
          db.Preload("Posts").Find(&users)
          // ...
      }
      

当使用GORM进行数据库操作时,可以使用查询条件、排序和分页来限制查询结果的数量和顺序。以下是关于这些主题的进一步笔记:

  1. 查询条件

    • 使用Where方法添加查询条件。

    • 使用And方法添加多个查询条件。

    • 使用Or方法添加多个查询条件之间的逻辑或关系。

    • 示例代码:

      func main() {
          // ...
          var users []User
          db.Where("age > ?", 18).And("name LIKE ?", "%John%").Find(&users)
          // ...
      }
      
  2. 排序

    • 使用Order方法指定排序字段和排序方向。

    • 使用Desc方法指定降序排序。

    • 使用Asc方法指定升序排序。

    • 示例代码:

      func main() {
          // ...
          var users []User
          db.Order("age desc").Find(&users)
          // ...
      }
      
  3. 分页

    • 使用Limit方法限制查询结果的数量。

    • 使用Offset方法指定查询结果的偏移量。

    • 示例代码:

      func main() {
          // ...
          var users []User
          db.Limit(10).Offset(20).Find(&users)
          // ...
      }
      

这只是关于查询条件、排序和分页的简要概括。