发布时间:2024-12-23 05:01:02
SQLX的特性:
1. 方便的参数绑定。
2. 结果集的映射。
3. 事务操作的支持。
4. 灵活的查询构建器。
import (
"database/sql"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Age int `db:"age"`
}
func main() {
// 连接到MySQL数据库
db, err := sqlx.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 执行查询
rows, err := db.Queryx("SELECT * FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
// 处理结果集
for rows.Next() {
var user User
err := rows.StructScan(&user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age)
}
if err = rows.Err(); err != nil {
log.Fatal(err)
}
}
在上述代码中,我们首先通过sqlx.Open函数连接到了MySQL数据库。接下来,我们使用db.Queryx执行了一条查询语句,并将结果保存在rows对象中。
通过rows.Next()遍历结果集,并使用rows.StructScan将结果映射到User结构体。最后,我们可以从User结构体中获取具体的字段值。
func transferFunds(db *sqlx.DB, fromAccount, toAccount int, amount float64) error {
tx, err := db.Beginx()
if err != nil {
return err
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
} else if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, fromAccount)
if err != nil {
return err
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, toAccount)
if err != nil {
return err
}
return nil
}
func main() {
// 连接到MySQL数据库
db, err := sqlx.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test")
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = transferFunds(db, 1, 2, 100.0)
if err != nil {
log.Fatal(err)
}
}
在上述代码中,我们定义了一个transferFunds函数来转账。在该函数中,我们首先使用db.Beginx启动一个事务,然后执行两条更新语句来更新余额。
如果出现任何错误,我们会回滚事务。如果成功执行所有操作,我们最后通过tx.Commit()来提交事务。
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Age int `db:"age"`
}
func main() {
// 连接到MySQL数据库
db, err := sqlx.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test")
if err != nil {
log.Fatal(err)
}
defer db.Close()
query, args, _ := sqlx.In("SELECT * FROM users WHERE id IN (?)", []int{1, 2, 3})
query = db.Rebind(query)
var users []User
err = db.Select(&users, query, args...)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", users)
}
在上述代码中,我们使用sqlx.In来构建IN子句,并将其与SELECT语句拼接在一起。之后,我们通过db.Rebind来替换占位符。
接下来,我们使用db.Select执行查询操作,并将结果映射到一个User的切片。最后,我们打印出结果。
- SQLX官方文档:https://github.com/jmoiron/sqlx
- Golang官方文档:https://golang.org/