使用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

7 回复

我不太明白你的意思;你能把你的代码和JSON粘贴在三个反引号之间吗,就像这样:

code here

更多关于使用Golang的Sqlx调用存储过程并传入JSON参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的快速回复。

问题已解决。我们的JSON字符串中包含反斜杠字符。我们已经从JSON字符串中移除了反斜杠字符。

它在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格式的输入参数。如果问题仍然存在,建议检查存储过程的实现和数据库日志。

回到顶部