--- name: db_insert_row kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func DBInsertRow(db *sql.DB, table string, row map[string]any) (int64, error)" description: "Genera y ejecuta un INSERT de una sola fila desde un map columna→valor. Retorna el last insert ID. Sanitiza nombres de tabla y columnas." tags: [database, sql, insert, row, dynamic] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["database/sql", "sort", "strings"] params: - name: db desc: "conexion sql.DB abierta" - name: table desc: "nombre de la tabla donde insertar" - name: row desc: "mapa de columna → valor con los datos a insertar" output: "ID autoincrementado de la fila insertada" tested: false tests: [] test_file_path: "" file_path: "functions/infra/db_insert_row.go" --- ## Ejemplo ```go id, err := DBInsertRow(db, "users", map[string]any{ "name": "Alice", "email": "alice@example.com", "active": true, }) if err != nil { return err } fmt.Printf("nuevo usuario ID: %d\n", id) ``` ## Notas Las claves del map se ordenan alfabeticamente para generar queries deterministas. Valida tabla y columnas con regex `^[a-zA-Z_][a-zA-Z0-9_]*$`. Para insertar muchas filas usar `DBInsertBatch` que es mas eficiente. El last insert ID puede ser 0 en drivers que no lo soportan (ej: postgres — usar RETURNING en su lugar con `DBQuery`).