--- name: db_query kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func DBQuery(db *sql.DB, query string, args ...any) ([]map[string]any, error)" description: "Ejecuta un SELECT y retorna los resultados como slice de maps. Convierte valores a tipos nativos Go segun el tipo de columna reportado por el driver." tags: [database, sql, query, select, generic] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["database/sql"] params: - name: db desc: "conexion sql.DB abierta" - name: query desc: "statement SELECT con placeholders ?" - name: args desc: "argumentos para los placeholders en la query" output: "slice de maps donde cada map es una fila con columna → valor" tested: false tests: [] test_file_path: "" file_path: "functions/infra/db_query.go" --- ## Ejemplo ```go rows, err := DBQuery(db, "SELECT id, name, score FROM players WHERE active = ?", true) if err != nil { return err } for _, row := range rows { fmt.Println(row["name"], row["score"]) } ``` ## Notas Agnóstica al driver — funciona con cualquier `*sql.DB` (sqlite, duckdb, postgres, clickhouse). Usa `sql.RawBytes` + `ColumnTypes()` para conversion dinamica. Convierte INTEGER→int64, FLOAT/REAL/DOUBLE→float64, BOOLEAN→bool, BLOB→[]byte, NULL→nil, resto→string. Para queries con muchos resultados considerar paginar con LIMIT/OFFSET.