Fork me on GitHub

GORM系列之创建数据

一、基本创建

(一)单条数据创建

  •  模型表
type Base struct {
    ID int
    Name string
    Age int
}
  • 方法一 通过数据的指针来创建
    base := Base{Name: "lily", Age: 18}
    result := db.Create(&base) //通过数据指针进行创建
    fmt.Println(result.Error) // 返回 error
    fmt.Println(result.RowsAffected) // 返回插入记录的条数
  • 方法二 根据 Map 创建
    db.Model(&Base{}).Create(map[string]interface{}{
        "Name": "kiki",
        "Age": 20,
    })

(二)批量创建

  • 方法一 通过数据的指针来创建

要有效地插入大量记录,请将一个 slice 传递给 create方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

    var baseUsers = []Base{
        {
            Name: "kiki",
            Age:  20,
        },
        {
            Name: "wan",
            Age:  22,
        },
    }
    db.Create(&baseUsers) // 创建多条记录

    for _, user := range baseUsers {
        fmt.Println(user.ID) //回填主键的值
    }

使用 CreateInBatches分批创建时,你可以指定每批的数量

    var baseUsers = []Base{
        {
            Name: "kiki",
            Age:  20,
        },
        {
            Name: "wan",
            Age:  22,
        },
          ...
    }
    db.CreateInBatches(&baseUsers, 100) // 每次插入100条    
  • 方法二 根据Map创建
    db.Model(&Base{}).Create([]map[string]interface{}{
        {
            "Name": "kiki",
            "Age":  20,
        },
        {
            "Name": "wan",
            "Age":  22,
        },
    })

二、创建进阶

(一)指定字段创建

    // 创建记录并更新给出的字段
    baseUser := Base{Name: "lily", Age: 18}
    //db.Select("Name", "Age").Create(&baseUser)
    // INSERT INTO `Base` (`name`,`age`) VALUES ("lily", 18)

    // 创建一个记录且一同忽略传递给略去的字段值, 此时Name取默认值为空
    db.Omit("Name").Create(&baseUser)
    // INSERT INTO `Base` (`age`) VALUES (18)

(二)关联创建

 如果一个模型嵌套另一个模型,那么怎么创建数据呢?

  • 模型表
type Base struct {
    ID   int
    Name string
    Age  int `gorm:"default:20"` //指定默认值为20
}

type User struct {
    Base     Base `gorm:"embedded;embeddedPrefix:base_"`
    NickName string
}
  • 创建
    // 关联创建, 如果没写字段使用默认值创建
    db.Create(&User{
        NickName: "小花",
        Base: Base{
            Name: "xiaohua",
        },
    })

也可以通过 Select、 Omit 跳过关联保存,例如:

db.Omit("Base").Create(&User)

// 跳过所有关联
db.Omit(clause.Associations).Create(&User)

 

posted @ 2022-03-04 07:59  iveBoy  阅读(1663)  评论(0编辑  收藏  举报
TOP