GoLang读取Starrocks表问题

(1) 写法1:

package main

import (
“database/sql”
“fmt”
_ “github.com/go-sql-driver/mysql
)

// 定义一个全局对象db
var db *sql.DB

// 获得数据库连接
func initDB() (err error) {
// 数据库连接信息
dsn := “root:123456@tcp(127.0.0.1:9030)/test?charset=utf8”
// Open函数只是验证格式是否正确,并不是创建数据库连接
db, err = sql.Open(“mysql”, dsn)
if err != nil {
return err
}

// 与数据库建立连接
err = db.Ping()
if err != nil {
    return err
}
return nil

}

func init() {
// 获得数据库连接
err := initDB()
if err != nil {
fmt.Printf(“err: %v\n”, err)
} else {
fmt.Println(“连接成功”)
}
}

type user struct {
id int
username string
}

// 查询单条记录
func queryRowData(id int) {
sqlStr := “select Id,username from tbl_user where id=?”
var u user
err := db.QueryRow(sqlStr, id).Scan(&u.id, &u.username)
if err != nil {
fmt.Printf(“err: %v\n”, err)
return
}
fmt.Printf(“Id:%d username:%v”, u.id, u.username)
}

func main() {
queryRowData(3)
}

这样的写法会出现下面的错误,防止sql注入:
连接成功
err: Error 1064 (HY000): Unsupported command(COM_STMT_PREPARE)

(2) 写法2,sql注入问题,需谨慎:

package main

import (
“database/sql”
“fmt”
“strconv”
_ “github.com/go-sql-driver/mysql

)

// 定义一个全局对象db

var db *sql.DB

// 获得数据库连接

func initDB() (err error) {
// 数据库连接信息
dsn := “root:123456@tcp(127.0.0.1:9030)/test?charset=utf8”
// Open函数只是验证格式是否正确,并不是创建数据库连接
db, err = sql.Open(“mysql”, dsn)
if err != nil {
return err
}

// 与数据库建立连接
err = db.Ping()
if err != nil {
    return err
}
return nil

}

func init() {
// 获得数据库连接
err := initDB()
if err != nil {
fmt.Printf(“err: %v\n”, err)
} else {
fmt.Println(“连接成功”)
}
}

type user struct {
id int
username string
}

func queryRowData(id int) {
sqlStr := “select id,username from tbl_user where id=” + strconv.Itoa(id) // 很容易出现sql注入问题
fmt.Println("sqlStr = ", sqlStr)
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println(“db.Query(sqlStr) fail, err =”, err)
return
}

defer rows.Close()
// 循环读取结果集中的数据
for rows.Next() {
    var u user
    err = rows.Scan(&u.id, &u.username)
    if err != nil {
        fmt.Printf("err: %v\n", err)
        return
    }
    fmt.Printf("id:%d username:%s", u.id, u.username)
}

}

func main() {
queryRowData(3)
}