【go】传 db 链接给函数后,执行 stmt.Exec 报错
在执行的时候报错了个 panic,说 内存地址无效 或 nil pointer 指向。
感觉应该是 stmt 对这种方式需要某种特殊处理。以指针方式传 db 链接,db.Query() 执行起来是没问题的,是否说明,传至是没问题的,只是 stmt 需要做特殊处理?
错误信息如下图:
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(®ion_id, ®ion_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