package db import ( "base-go-v2/internal/utils/mapx" "fmt" "strings" ) // ---------------- 通用查询方法 ---------------- func queryMaps(query string, args []interface{}) ([]mapx.M, error) { rows, err := DB.Queryx(query, args...) if err != nil { return nil, err } defer rows.Close() var result []mapx.M for rows.Next() { row := mapx.New() if err := rows.MapScan(row); err != nil { return nil, err } // 统一处理 []byte 类型,直接转字符串,保留原始小数点 for k, v := range row { if b, ok := v.([]byte); ok { row[k] = string(b) } } result = append(result, row) } return result, nil } func queryMap(query string, args []interface{}) (mapx.M, error) { rows, err := DB.Queryx(query, args...) if err != nil { return nil, err } defer rows.Close() if rows.Next() { row := mapx.New() if err := rows.MapScan(row); err != nil { return nil, err } // 统一处理 []byte 类型,直接转字符串 for k, v := range row { if b, ok := v.([]byte); ok { row[k] = string(b) } } return row, nil } return nil, nil } // BuildWhereString 将 map 条件转换为 SQL WHERE 字符串 func BuildWhereString(conds mapx.M) string { if len(conds) == 0 { return "" } var parts []string for k, v := range conds { parts = append(parts, fmt.Sprintf("%s='%v'", k, v)) } return strings.Join(parts, " AND ") } // ---------------- 统一 select 系列方法 ---------------- // SelectById 根据主键查询单条记录 func SelectById(tableName, pkColumn string, pkValue interface{}) (mapx.M, error) { query := fmt.Sprintf("SELECT * FROM %s WHERE %s=$1", tableName, pkColumn) return queryMap(query, []interface{}{pkValue}) } // SelectBySql 根据任意 SQL 查询多条记录 func SelectBySql(sql string, args ...interface{}) ([]mapx.M, error) { return queryMaps(sql, args) } // SelectList 查询列表,可传 where 和 order,where 可以为空 func SelectList(tableName string, where string, order string) ([]mapx.M, error) { query := fmt.Sprintf("SELECT * FROM %s", tableName) if strings.TrimSpace(where) != "" { query += " WHERE " + where } if strings.TrimSpace(order) == "" { order = "id DESC" } query += " ORDER BY " + order return queryMaps(query, nil) } // SelectOne 查询单条记录,可传 where 和 order(order 可为空) func SelectOne(tableName string, where string, order string) (mapx.M, error) { query := fmt.Sprintf("SELECT * FROM %s", tableName) if strings.TrimSpace(where) != "" { query += " WHERE " + where } if strings.TrimSpace(order) == "" { order = "id DESC" // 默认排序 } query += " ORDER BY " + order + " LIMIT 1" return queryMap(query, nil) }