Go调用Tarantool执行SQL无返回错误,如何正确获取执行异常?
Tarantool Go 客户端SQL执行错误获取方案
问题原因
你用conn.Eval拿不到SQL执行错误是因为:
conn.Eval返回的err仅代表网络通信、请求序列化/反序列化层面的错误,只要Tarantool服务端正常返回响应,该值就为nilresp.Error仅存储Lua脚本运行时抛出的异常,而box.execute执行SQL出错时默认返回错误对象,不会主动抛出异常,因此不会被resp.Error捕获
解决方案
方案1:修改Eval调用的Lua脚本主动抛错
在Lua脚本中手动判断box.execute的返回值,出现错误时主动抛出,就能被resp.Error捕获:
resp, err := conn.Eval(` local result, exec_err = box.execute(...) if exec_err ~= nil then error(exec_err) end return result `, []interface{}{"TRUNCATE TABLE not_exists;"}) // 处理网络/请求层面错误 if err != nil { log.Fatalf("调用失败: %v", err) } // 处理SQL执行错误 if resp.Error != nil { log.Fatalf("SQL执行错误: %v", resp.Error) }
方案2(推荐):使用内置的Execute方法执行SQL
官方Tarantool Go客户端提供了专门的Execute方法用于执行SQL,会自动处理错误捕获和结果解析,无需自己封装Lua脚本:
// 第一个参数为SQL语句,第二个为参数绑定数组 res, err := conn.Execute("TRUNCATE TABLE not_exists;", []interface{}{}) if err != nil { // 这里可以直接捕获所有错误:包括网络错误、SQL语法错误、执行逻辑错误等 log.Fatalf("执行失败: %v", err) }
注意事项
- 执行带参数的SQL时,使用
?作为占位符传参,不要手动拼接字符串避免SQL注入,示例:conn.Execute("INSERT INTO users(id, name) VALUES(?, ?)", []interface{}{1, "张三"}) Execute方法要求go-tarantool客户端版本≥v1.10.0,Tarantool服务端版本≥2.0Execute返回的结果对象中内置了影响行数、返回行集等常用属性,无需手动解析Lua返回值
内容的提问来源于stack exchange,提问作者mosceo
相关产品推荐
相关产品推荐

