120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
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)
|
||
}
|