【go】传 db 链接给函数后,执行 stmt.Exec 报错

在执行的时候报错了个 panic,说 内存地址无效 或 nil pointer 指向。
感觉应该是 stmt 对这种方式需要某种特殊处理。以指针方式传 db 链接,db.Query() 执行起来是没问题的,是否说明,传至是没问题的,只是 stmt 需要做特殊处理?
错误信息如下图:

【go】传 db 链接给函数后,执行 stmt.Exec 报错

func main() {

db, err := sql.Open("mysql", "root:[email protected](localhost:8889)/dblingsy")

if err != nil {

log.Fatal(err)

}

defer db.Close()

fixData(db, "[1-9]{2}0000", "", 0, 1) // 处理省级:只需要将省级 level 更新为 1

}

func fixData(db *sql.DB, regexp, regexp2 string, offset, level int) {

stmt, _ := db.Prepare("UPDATE `lc_tencent_regions` SET ? WHERE reigon_code REGEXP ?")

defer stmt.Close()

if regexp2 == "" {

stmt.Exec("level="+strconv.Itoa(level), regexp)

} else {

rows, err := db.Query("SELECT region_id,region_code FROM `lc_tencent_regions` WHERE region_code REGEXP ?", regexp)

defer rows.Close()

if err != nil {

log.Fatal(err)

}

var (

region_id int

region_code int

)

for rows.Next() {

rows.Scan(&region_id, &region_code)

regexp := strconv.Itoa(region_code/offset) + regexp2

stmt.Exec("parent="+strconv.Itoa(region_id)+", level="+strconv.Itoa(level), regexp)

}

}

}

回答

stmt.Prepare()
确实为空,原因是 SQL错误:
stmt, _ := db.Prepare("UPDATE lc_tencent_regions SET ? WHERE region_code REGEXP ?")
在预处理此处的 UPDATE SQL 的时候,必须提供字段名,问号只能用作 字段值 的占位符!

以上是 【go】传 db 链接给函数后,执行 stmt.Exec 报错 的全部内容, 来源链接: utcz.com/a/109298.html

回到顶部