在应用程序中处理NULL值并发送到数据库

时间:2018-02-01 16:19:34

标签: go

我有可以在我的应用程序中使用的可空变量,并且还发送到具有默认为null的列的数据库。

这是一个示例结构:

// Location type
type Location struct {
    ID      int `schema:"id"`
    Title   *string `schema:"title"`
}

标题定义为* string,因为它可能为null(例如,没有用户输入或客户端应用程序将其作为null发送)。

这是我的函数接收表单数据:

// JSONLocationCreate func
func (a *App) JSONLocationCreate(w http.ResponseWriter, r *http.Request) {

    r.ParseForm()

    var e Location

    err := decoder.Decode(&e, r.PostForm)
    if err != nil {
        respondWithError(w, http.StatusBadRequest, "Invalid request payload")
        return
    }


    // --- SUCCESS ---
    // If e.Title has data, the following line works.

    // --- FAIL ---
    // If e.Title doesn’t have data (for whatever reason), it’s null, and crashes the app:
    log.Println(*e.Title)


    // Ultimately the variable would be sent off to a database.
    // Below I’m removing other functions and such, just including my statement line.


    // --- SUCCESS ---
    // If e.Title has data, the following line works.

    // --- FAIL ---
    // If e.Title is null (e.g. no user input), this crashes the app.
    statement := fmt.Sprintf("INSERT INTO locations(title) VALUES('%s')", *e.Title)

    // In either case, the crash error is similar to this:
    // panic serving [::1]:52459: runtime error: invalid memory address or nil pointer dereference
}

关注1:如何在整个应用程序中使用可空变量(如e.Title),而不会在变量为空时抛出恐慌错误?最好的做法是将它包装在一个将null转换为“”字符串的函数中吗?如何透明地应用这样的函数,所以我不必在变量的每个实例上都有类似“nullCheck(* e.Title)”的东西?

关注2:对于我的数据库查询,我不能将“”字符串值发送到数据库中代替空值。到目前为止,我的查询是手动构建的。我想我需要一个函数来生成SQL查询,当变量为空时自动排除列和变量。

我是否在正确的轨道上?有什么例子吗?

在搜索数小时后,我还没有理解所有的主题/教程。

1 个答案:

答案 0 :(得分:0)

通过为您的字段添加getter方法

可以轻松解决问题1
func (l Location) GetTitle() string {
    if l.Title == nil {
        return ""
    }
    return *l.Title
}

关注2: 这取决于你想要做什么SQL查询,我建议你研究一些ORM库,它们为你自动化了很多特定于数据库的代码。 Gorm是这种库的一个很好的例子:https://github.com/jinzhu/gorm