Golang sqlx 返回多个结果
Certainly! When working with sqlx in Go to handle multiple result sets, you can use the sqlx.Rows type to iterate over the results. Here's an example to illustrate how you can achieve this:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type User struct {
ID int `db:"id"`
Name string `db:"name"`
}
type Order struct {
ID int `db:"id"`
UserID int `db:"user_id"`
Amount float64 `db:"amount"`
}
func main() {
// Connect to the database
db, err := sqlx.Connect("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
log.Fatalln(err)
}
// Query with multiple result sets
query := `
SELECT id, name FROM users;
SELECT id, user_id, amount FROM orders;
`
rows, err := db.Queryx(query)
if err != nil {
log.Fatalln(err)
}
defer rows.Close()
// Process the first result set
var users []User
for rows.Next() {
var user User
if err := rows.StructScan(&user); err != nil {
log.Fatalln(err)
}
users = append(users, user)
}
// Move to the next result set
if rows.NextResultSet() {
var orders []Order
for rows.Next() {
var order Order
if err := rows.StructScan(&order); err != nil {
log.Fatalln(err)
}
orders = append(orders, order)
}
// Output the results
fmt.Println("Users:", users)
fmt.Println("Orders:", orders)
} else {
log.Println("No more result sets")
}
}
Explanation:
- Database Connection: Establish a connection to the database using
sqlx.Connect. - Query Execution: Execute a query that returns multiple result sets.
- First Result Set: Iterate over the first result set and scan the rows into a slice of User structs.
- Next Result Set: Move to the next result set using
rows.NextResultSet()and iterate over it, scanning the rows into a slice of Order structs. - Output: Print the results.
This example demonstrates how to handle multiple result sets using sqlx in Go. Adjust the query and struct definitions as needed for your specific use case.