Files
fn_registry/functions/infra/sqlite_apply_migrations.md
egutierrez 03568c88e3 chore: auto-commit (57 archivos)
- frontend/functions/core/format_datetime_short.md
- frontend/functions/core/format_datetime_short.test.ts
- frontend/functions/core/format_datetime_short.ts
- frontend/functions/core/format_duration.md
- frontend/functions/core/format_duration.test.ts
- frontend/functions/core/format_duration.ts
- frontend/functions/core/month_grid.md
- frontend/functions/core/month_grid.test.ts
- frontend/functions/core/month_grid.ts
- frontend/functions/core/string_hash_palette.md
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 03:41:58 +02:00

2.4 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
sqlite_apply_migrations function go infra 1.0.0 impure func ApplyMigrations(conn *sql.DB, fsys fs.FS, glob string) error Aplica migraciones SQL desde un fs.FS en orden lexicografico. Lee archivos con glob (default 'migrations/*.sql'), divide por sentencias y ejecuta cada una contra conn. Errores idempotentes (duplicate column, already exists) se ignoran.
database
sqlite
migration
schema
embed
fs
false error_go_core
database/sql
fmt
io/fs
sort
strings
name desc
conn conexion *sql.DB donde se ejecutan las migraciones
name desc
fsys sistema de archivos con los .sql (tipicamente embed.FS del caller)
name desc
glob patron glob para seleccionar archivos (vacio = 'migrations/*.sql')
nil si todas las migraciones se aplicaron correctamente; error del primer fallo no idempotente con nombre de archivo incluido true
una migracion se aplica correctamente
multiples migraciones en orden
error real se propaga
ALTER TABLE ADD COLUMN duplicado se ignora
functions/infra/sqlite_apply_migrations_test.go functions/infra/sqlite_apply_migrations.go

Ejemplo

//go:embed migrations/*.sql
var migrationsFS embed.FS

func openDB(path string) (*sql.DB, error) {
    db, err := infra.SQLiteOpen(path, "")
    if err != nil {
        return nil, err
    }
    if err := infra.ApplyMigrations(db, migrationsFS, ""); err != nil {
        db.Close()
        return nil, fmt.Errorf("migrate: %w", err)
    }
    return db, nil
}

Notas

Extraido de apps/kanban/backend/db.go. El parser de sentencias SQL es intencionalmente simple: separa por ; al final de una linea (ignorando comentarios -- y lineas vacias). Esta logica falla si el SQL contiene un ; dentro de un string literal al final de linea — evitar ese patron en los archivos de migracion.

Los errores idempotentes (duplicate column, already exists) se ignoran para que las migraciones sean re-ejecutables contra DBs que ya tenian parte del schema. Esto permite un flujo sin tabla _migrations para proyectos pequenos; para proyectos con muchas migraciones y rollback, usar migration_up_go_infra / migration_down_go_infra.