使用Golang的Sqlx调用存储过程并传入JSON参数
使用Golang的Sqlx调用存储过程并传入JSON参数 我们正在使用 Sqlx 库。 我们创建了一个存储过程,该过程以 JSON 作为输入参数。
我们尝试使用以下命令进行调用:
input := {“code”:2001,“EmailID”:“abcd”,“MobileNumber”:1234567890,“StudentPassword”:“Abcd1234”}
_,err = easyglobal.Mydb.Exec( “CALL IU_Registration (?)”, input)
此过程应在表中插入记录。
该命令可以执行,但并未在表中插入任何记录。
我们没有收到任何错误信息。
更多关于使用Golang的Sqlx调用存储过程并传入JSON参数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我不太明白你的意思;你能把你的代码和JSON粘贴在三个反引号之间吗,就像这样:
code here
更多关于使用Golang的Sqlx调用存储过程并传入JSON参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
它在JSON中添加了“反斜杠”字符。 如何在Golang中从JSON中移除反斜杠字符。
我想我已经找到了问题所在。它在JSON中添加了“”字符。
CALL IU_Registration (’ {“Aadhaar”:2001,“EmailID”:“abcd”,“MobileNumber”:1234567890,“StudentPassword”:“Abcd1234”} ')
我该如何从JSON中移除这个字符。
如果你从某个可以编写和执行SQL查询的交互式程序(例如SQL Server的SQL Server Management Studio、Postgres的pgAdmin等)中手动调用该过程,它能正常工作吗?
如果你从 easyglobal.Mydb 查询行,能得到任何结果吗?
如果你执行一个普通的 INSERT 而不是调用存储过程,情况如何;那样能工作吗?
是的,它在工作台中运行正常。
CALL IU_Registration(’{“Aadhaar”:2001,“EmailID”:“abcd”,“MobileNumber”:1234567890,“StudentPassword”:“Abcd1234”,“mode”:“INSERT”}’)
这是工作台的输出: 2001;abcd;1234567890;Abcd1234
感谢您的快速回复。
根据你的描述,问题可能在于没有正确地将Go数据结构转换为JSON字符串传递给存储过程。以下是正确的实现方式:
package main
import (
"encoding/json"
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
type RegistrationInput struct {
Code int `json:"code"`
EmailID string `json:"EmailID"`
MobileNumber int64 `json:"MobileNumber"`
StudentPassword string `json:"StudentPassword"`
}
func main() {
// 假设已经初始化了数据库连接
// db := sqlx.MustConnect("mysql", "user:password@/dbname")
input := RegistrationInput{
Code: 2001,
EmailID: "abcd",
MobileNumber: 1234567890,
StudentPassword: "Abcd1234",
}
// 将结构体转换为JSON字符串
jsonBytes, err := json.Marshal(input)
if err != nil {
fmt.Printf("JSON编码错误: %v\n", err)
return
}
jsonStr := string(jsonBytes)
// 调用存储过程
_, err = easyglobal.Mydb.Exec("CALL IU_Registration(?)", jsonStr)
if err != nil {
fmt.Printf("存储过程调用错误: %v\n", err)
return
}
fmt.Println("存储过程调用成功")
}
如果存储过程需要明确的JSON参数类型,可以尝试以下方式:
// 使用命名参数的方式
_, err = easyglobal.Mydb.NamedExec(`CALL IU_Registration(:json_input)`,
map[string]interface{}{
"json_input": jsonStr,
})
或者使用更直接的方式:
// 直接传递JSON字符串
jsonInput := `{"code":2001,"EmailID":"abcd","MobileNumber":1234567890,"StudentPassword":"Abcd1234"}`
_, err = easyglobal.Mydb.Exec("CALL IU_Registration(?)", jsonInput)
为了调试,可以添加错误处理和日志记录:
result, err := easyglobal.Mydb.Exec("CALL IU_Registration(?)", jsonStr)
if err != nil {
fmt.Printf("错误: %v\n", err)
return
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("影响的行数: %d\n", rowsAffected)
确保数据库连接配置正确,并且存储过程确实期望JSON格式的输入参数。如果问题仍然存在,建议检查存储过程的实现和数据库日志。


