要在 GORM 中批量插入表并返回 id 列表,可以使用以下步骤:
- 定义一个结构体来表示要插入的数据。
type User struct {
Name string
Email string
}
- 创建一个切片来存储要插入的数据。
users := []User{
{Name: "Alice", Email: "alice@example.com"},
{Name: "Bob", Email: "bob@example.com"},
}
- 使用 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。
- 将插入结果的 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 语句,可以使用以下步骤:
- 创建一个 sql.DB 对象来访问数据库。
db, err := sql.Open("mysql", "user:password@/database")
if err != nil {
// 处理错误
}
defer db.Close()
- 创建一个事务,并执行 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。
- 返回插入的记录的 ID 列表。
fmt.Println(ids) // [1 2]
需要注意的是,使用原生 SQL 语句可以获得更好的性能,但需要自己管理事务和错误处理。