dow56114 2019-07-13 16:47
浏览 47
已采纳

在'Name =?'附近使用的正确语法

i'm trying to filter my registers with a "Name" parameter.

I make this handler function:

func GetFuncionaries(w http.ResponseWriter, r *http.Request) {
    var f model.Funcionary
    var t util.App
    var d db.DB
    err := d.Connection()
    db := d.DB
    defer db.Close()

    Id, _ := strconv.Atoi(r.FormValue("Id"))
    Name:= r.FormValue("Name")

    f.Id = int64(Id)
    f.Name = Name

    funcionaries, err := f.GetFuncionaries(db)
    if err != nil {
            log.Printf("[handler/GetFuncionaries-  Error: %s", err.Error())
            t.ResponseWithError(w, http.StatusInternalServerError, err.Error(), "")
        }
        return
    }
    t.ResponseWithJSON(w, http.StatusOK, funcionaries, 0, 0)
}

And the function model:

func (f *Funcionary) GetFuncionaries(db *sql.DB) ([]Funcionary, error) {
    var values []interface{}
    var where []string

    if f.Name != "" {
        where = append(where, "Name= ?")
        values = append(values, f.Name)
    }


    rows, err := db.Query(`SELECT Id, Data, Role, Name
                    FROM funcionaries
                    WHERE 1=1 `+strings.Join(where, " AND "), values...)
    if err != nil {
        return nil, err
    }

    funcionaries:= []Funcionary{}
    defer rows.Close()
    for rows.Next() {
        var funcionary Funcionary
        if err = rows.Scan(&funcionario.Id, &funcionario.Name, &Others...); err != nil {
            return nil, err
        }
        funcionaries = append(funcionaries, funcionary)
    }
    return funcionaries, nil
}

But when i make a call in postman like:

http://localhost:8000/api/funcionaries?Name=a

I receive the error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Name= ?' at line 3",

I'm forgetting something?

  • 写回答

1条回答 默认 最新

  • duanhan8757 2019-07-13 17:23
    关注

    It looks to me like the SQL string produced by your code will be

    SELECT Id, Data, Role, Name FROM funcionaries WHERE 1=1 Name= ?
    

    Whereas what you want is:

    SELECT Id, Data, Role, Name FROM funcionaries WHERE 1=1 AND Name= ?
    

    To do this you could modify your code like so:

    q := `SELECT Id, Data, Role, Name
              FROM funcionaries
              WHERE True`
    if len(where) != 0 {
        q = q + " AND " + strings.Join(where, " AND ")
    }
    rows, err := db.Query(q, values...)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。