diff --git a/lxDb/sql.go b/lxDb/sql.go index 0167000..ae6d6ef 100644 --- a/lxDb/sql.go +++ b/lxDb/sql.go @@ -230,8 +230,7 @@ func SqlQuery(tx *gorm.DB, sql string, list interface{}, q *PaginationQuery, par } else if strings.HasPrefix(where, " OR ") { where = strings.Replace(where, " OR ", " WHERE ", 1) builder.WriteString(where) - } else if where != "" { - builder.WriteString(" WHERE ") + } else { builder.WriteString(where) } } @@ -261,14 +260,13 @@ func SqlQuery(tx *gorm.DB, sql string, list interface{}, q *PaginationQuery, par if len(q.Summary) != 0 { tx = tx.Offset(-1) // 需要去除offset, 否则结果可能为空, 注意: 设置0不起作用. var summary = make(map[string]interface{}) + //tx.Order("") // FIXME: 怎么去掉order by, sum是不需要order by的, 影响性能. + //tx.Select(q.SummarySql).Take(&summary) // 不适合rawsql? - // 安全构建汇总查询 - 使用参数化查询 - summarySQL := "SELECT " + strings.Join(q.SummarySql, ", ") + " FROM (" + sql2 + ") ssss" - if err := tx.Raw(summarySQL, params...).Take(&summary).Error; err != nil { - return err - } + tx.Raw("SELECT "+strings.Join(q.SummarySql, ", ")+" FROM ("+sql2+") ssss", params...).Take(&summary) // []byte 转 string. 不太合理, 应该返回int或float + for k, v := range summary { if bs, ok := v.([]byte); ok { summary[k] = string(bs) @@ -292,19 +290,17 @@ func SqlQuery(tx *gorm.DB, sql string, list interface{}, q *PaginationQuery, par if q.Limit > 0 { if q.Offset > 0 { offset := (q.Offset - 1) * q.Limit - builder.WriteString(" LIMIT ?, ?") - params = append(params, offset, q.Limit) + s := fmt.Sprintf(" LIMIT %d, %d", offset, q.Limit) + builder.WriteString(s) } else { - builder.WriteString(" LIMIT ?") - params = append(params, q.Limit) + s := fmt.Sprintf(" LIMIT %d", q.Limit) + builder.WriteString(s) } } } // 执行最终查询 - 使用参数化查询 - if err := tx.Raw(builder.String(), params...).Find(list).Error; err != nil { - return err - } + tx.Raw(builder.String(), params...).Find(list) return }