func queryRowDemo() { sqlstr := "select * from user where id = ?" var u user err := db.QueryRow(sqlstr, 1).Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) }
func queryMUltiRowDemo() { sqlstr := "select * from user where id > ?" rows, err := db.Query(sqlstr, 3) if err != nil { fmt.Printf("query failed, err:%v\n", err) return } defer rows.Close() for rows.Next() { var u user err := rows.Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } }
deferfunc() { if p := recover(); p != nil { tx.Rollback() // 1. If a panic occurs, rollback the transaction. panic(p) // 2. Re-panic to allow further handling or propagation. } elseif err != nil { fmt.Println("err:", err) fmt.Println("rollback") // 3. If an error occurred, print "rollback". tx.Rollback() // 4. Rollback the transaction. } else { err = tx.Commit() // 5. If no error, try to commit the transaction. fmt.Println("commit") // 6. Print "commit" after a successful commit. } }()
// QueryByIDs 根据给定ID查询 func QueryByIDs(ids []int)(users []User, errerror){ // 动态填充id query, args, err := sqlx.In("SELECT name, age FROM user WHERE id IN (?)", ids) iferr != nil { return } // sqlx.In 返回带 `?` bindvar的查询语句, 我们使用Rebind()重新绑定。 // 重新生成对应数据库的查询语句(如PostgreSQL 用 `$1`, `$2` bindvar) query = DB.Rebind(query)
err = DB.Select(&users, query, args...) return }
sqlx.In 的作用
在 SQL 查询中,如果需要使用 IN 子句来匹配多条记录,通常会面临一个问题:
如何动态填充 IN 子句中的参数?
直接拼接字符串是不安全的,并可能引发 SQL 注入风险。sqlx.In 解决了这个问题。
sqlx.In 的主要功能
安全地处理 IN 子句中的多个参数。
将切片/数组作为参数展开,动态生成 SQL 查询。
返回 SQL 语句及参数数组,以供后续执行查询。
示例:sqlx.In 的用法
1 2 3 4 5 6 7 8 9 10
ids := []int{1, 2, 5}
// 使用 sqlx.In 生成 SQL 查询和参数 query, args, err := sqlx.In("SELECT name, age FROM user WHERE id IN (?)", ids) if err != nil { fmt.Printf("sqlx.In failed: %v\n", err) return } fmt.Println("Query:", query) fmt.Println("Args:", args)
输出:
1 2
Query: SELECTname, age FROMuserWHERE id IN (?, ?, ?) Args: [125]
解释
sqlx.In 将数组 ids 展开为多个占位符,并生成 SQL 语句: SELECT name, age FROM user WHERE id IN (?, ?, ?)
funcQueryByIDs(ids []int) ([]User, error) { // 使用 sqlx.In 生成 SQL 语句和参数 query, args, err := sqlx.In("SELECT name, age FROM user WHERE id IN (?)", ids) if err != nil { returnnil, err }
// 使用 Get 获取单个用户 var user User err := db.Get(&user, "SELECT * FROM users WHERE id = ?", 1) if err != nil { log.Fatalf("获取用户失败: %v", err) } fmt.Printf("单个用户: %+v\n", user)
// 使用 Select 获取多个用户 var users []User err = db.Select(&users, "SELECT * FROM users WHERE age > ?", 18) if err != nil { log.Fatalf("选择用户失败: %v", err) } fmt.Printf("年龄大于18的用户: %+v\n", users) }