--- name: sqlite_open kind: function lang: go domain: infra version: "1.1.0" purity: impure signature: "func SQLiteOpen(path string, basePath string) (*sql.DB, error)" description: "Abre (o crea) una base de datos SQLite con WAL mode y foreign keys habilitados. Hace ping para verificar la conexion. Si basePath es no-vacio y path es relativo, resuelve el path como filepath.Join(basePath, path)." tags: [database, sqlite, connection, sql] uses_functions: [] uses_types: [db_config_go_infra] returns: [] returns_optional: false error_type: "error_go_core" imports: ["database/sql", "path/filepath", "github.com/mattn/go-sqlite3"] params: - name: path desc: "ruta del archivo SQLite (:memory: para base en memoria)" - name: basePath desc: "ruta base para resolver paths relativos (vacio = relativo al cwd)" output: "conexion sql.DB abierta a SQLite con WAL mode y foreign keys" tested: false tests: [] test_file_path: "" file_path: "functions/infra/sqlite_open.go" --- ## Ejemplo ```go // Path absoluto o relativo al cwd db, err := SQLiteOpen("/data/myapp.db", "") if err != nil { log.Fatal(err) } defer DBClose(db) // Path relativo al directorio del archivo YAML de configuracion configDir := filepath.Dir(configPath) db, err := SQLiteOpen(cfg.DatabasePath, configDir) if err != nil { log.Fatal(err) } rows, err := DBQuery(db, "SELECT * FROM users WHERE active = ?", 1) ``` ## Notas Usa el driver `github.com/mattn/go-sqlite3` (CGO). El DSN incluye `_journal_mode=WAL` para mejor concurrencia y `_foreign_keys=on`. Acepta `:memory:` para base de datos en memoria (basePath se ignora en este caso). Hace ping al abrir para detectar errores temprano. El parametro `basePath` resuelve el problema de paths relativos en configs YAML: cuando el binario corre desde un directorio distinto al del archivo de config, el path relativo se interpreta incorrectamente. Pasar `filepath.Dir(configPath)` como basePath corrige esto. Para mantener el comportamiento anterior (resolver vs cwd), pasar `basePath = ""`.