请求补全Go语言操作PostgreSQL的Regional数据查询函数
补全后的Go语言PostgreSQL查询函数
我注意到你的函数还缺几个关键环节:过滤条件处理、查询执行、结果扫描、资源清理,还有总数统计。下面是补全后的完整代码,同时优化了一些细节(比如单次查询场景下用Query替代Prepare更高效,完善了错误处理逻辑):
import ( "database/sql" "fmt" "log" "strings" "your-module-path/model" // 记得替换成你实际的model包路径 ) func (m *rg) GetAllRegional(filter map[string]interface{}) ([]*model.Regional, int64, error) { // 基础查询语句 baseQuery := `SELECT title, language, isviewmain FROM Regional` countQuery := `SELECT COUNT(*) FROM Regional` var args []interface{} var whereClauses []string // 动态构建过滤条件 if filter != nil { for key, value := range filter { // 用参数化查询避免SQL注入,这里假设map的键和数据库列名一致 whereClauses = append(whereClauses, fmt.Sprintf("%s = $%d", key, len(args)+1)) args = append(args, value) } } // 给查询语句拼接WHERE子句 if len(whereClauses) > 0 { baseQuery += " WHERE " + strings.Join(whereClauses, " AND ") countQuery += " WHERE " + strings.Join(whereClauses, " AND ") } // 获取符合条件的总记录数 var total int64 err := m.DB.QueryRow(countQuery, args...).Scan(&total) if err != nil { log.Printf("获取总记录数失败: %v", err) return nil, 0, err } // 执行数据查询 rows, err := m.DB.Query(baseQuery, args...) if err != nil { log.Printf("执行查询失败: %v", err) return nil, 0, err } defer rows.Close() // 确保结果集被正确关闭,防止资源泄漏 // 遍历结果集并扫描到结构体切片中 regionals := make([]*model.Regional, 0) for rows.Next() { r := &model.Regional{} err := rows.Scan(&r.Title, &r.Language, &r.IsViewMain) if err != nil { log.Printf("扫描行数据失败: %v", err) return nil, 0, err } regionals = append(regionals, r) } // 检查遍历结果集时是否出现错误 if err := rows.Err(); err != nil { log.Printf("遍历结果集出错: %v", err) return nil, 0, err } return regionals, total, nil }
关键补充和优化说明:
- 过滤条件支持:动态构建
WHERE子句,支持传入任意键值对作为过滤条件,全程用参数化查询杜绝SQL注入风险。 - 总数统计:单独执行count查询返回符合条件的记录总数,满足函数返回值的要求。
- 资源安全:用
defer rows.Close()确保数据库结果集被及时关闭,避免资源泄漏。 - 错误处理:每个数据库操作都添加了针对性的错误日志和返回逻辑,方便后续调试排查。
- 性能优化:单次查询场景下直接用
Query/QueryRow比Prepare更高效(Prepare更适合重复执行的查询)。
额外注意点:
- 确保你的
model.Regional结构体字段和数据库列名对应,如果字段名和列名不一致,可以给结构体加标签(比如db:"title"),或者调整Scan时的参数顺序。 - 如果需要更复杂的过滤逻辑(比如模糊查询、范围查询),可以扩展filter的处理逻辑,比如约定特殊键前缀(如
title__like表示模糊匹配)来区分不同的查询类型。
内容的提问来源于stack exchange,提问作者Conan Doyle
相关产品推荐
相关产品推荐

