GORM批量插入表并返回id列表

要在 GORM 中批量插入表并返回 id 列表,可以使用以下步骤:

  1. 定义一个结构体来表示要插入的数据。
type User struct {
    Name  string
    Email string
}
  1. 创建一个切片来存储要插入的数据。
users := []User{
    {Name: "Alice", Email: "alice@example.com"},
    {Name: "Bob", Email: "bob@example.com"},
}
  1. 使用 GORM 的 Create 方法来插入数据,并将插入的结果存储在一个切片中。
var ids []uint64
for _, user := range users {
    result := db.Create(&user)
    if result.Error != nil {
        // 处理错误
    }
    ids = append(ids, user.ID)
}

其中,& 符号用于获取结构体的地址,以便 Create 方法可以访问数据。Create 方法会返回一个包含插入结果的结构体,其中包含插入的记录的 ID。

  1. 将插入结果的 ID 存储在一个切片中,以便返回。
fmt.Println(ids) // [1 2]

需要注意的是,批量插入数据可能会影响性能,因此建议在需要插入大量数据时使用批量插入方法。此外,如果要返回插入的结果,可以使用 GORM 提供的方法来实现。

使用原生 SQL 语句也可以实现批量插入数据并返回 ID 列表。以下是一个示例 SQL 语句:

INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com');
SELECT LAST_INSERT_ID();

这个 SQL 语句将会插入两条记录到 users 表中,并返回插入的记录的 ID 列表。要在 Go 中执行这个 SQL 语句,可以使用以下步骤:

  1. 创建一个 sql.DB 对象来访问数据库。
db, err := sql.Open("mysql", "user:password@/database")
if err != nil {
    // 处理错误
}
defer db.Close()
  1. 创建一个事务,并执行 SQL 语句。
tx, err := db.Begin()
if err != nil {
    // 处理错误
}
defer func() {
    if err != nil {
        tx.Rollback()
        return
    }
    err = tx.Commit()
}()

stmt, err := tx.Prepare(`
    INSERT INTO users (name, email)
    VALUES (?, ?)
`)
if err != nil {
    // 处理错误
}
defer stmt.Close()

var ids []uint64
for _, user := range users {
    result, err := stmt.Exec(user.Name, user.Email)
    if err != nil {
        // 处理错误
    }
    id, err := result.LastInsertId()
    if err != nil {
        // 处理错误
    }
    ids = append(ids, uint64(id))
}

其中,tx.Begin() 方法创建了一个事务,stmt.Prepare() 方法创建了一个预处理语句,并在循环中执行了插入操作。result.LastInsertId() 方法返回插入的记录的 ID。

  1. 返回插入的记录的 ID 列表。
fmt.Println(ids) // [1 2]

需要注意的是,使用原生 SQL 语句可以获得更好的性能,但需要自己管理事务和错误处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值