Files
workspace/code/base-project/base-go-v2/internal/db/query.go
T
2025-11-15 17:31:36 +08:00

120 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}