--- name: migration_create kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func MigrationCreate(dir string, name string) (string, error)" description: "Crea un archivo .sql de migracion con template -- +up / -- +down en el directorio indicado. Calcula automaticamente el siguiente numero de version escaneando archivos .sql existentes. Retorna el path absoluto del archivo creado." tags: [migration, database, sql, schema, sqlite, create, file] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["fmt", "os", "path/filepath", "regexp", "strconv", "strings"] params: - name: dir desc: "directorio donde crear el archivo de migracion (se crea si no existe, ej: apps/my_app/migrations)" - name: name desc: "nombre descriptivo de la migracion en snake_case (ej: create_users, add_email_column). Solo letras, numeros y underscore." output: "path absoluto del archivo .sql creado (ej: apps/my_app/migrations/001_create_users.sql)" tested: true tests: - "directorio vacio crea archivo con version 001" - "directorio con migraciones existentes calcula siguiente version" - "nombre invalido retorna error" - "directorio inexistente se crea automaticamente" test_file_path: "functions/infra/migration_create_test.go" file_path: "functions/infra/migration_create.go" --- ## Ejemplo ```go // Primera migracion path, err := MigrationCreate("apps/my_app/migrations", "create_users") // path = "apps/my_app/migrations/001_create_users.sql" // Contenido del archivo: // -- 001_create_users.sql // // -- +up // // // -- +down // // Segunda migracion (ya existe 001) path2, err := MigrationCreate("apps/my_app/migrations", "add_email") // path2 = "apps/my_app/migrations/002_add_email.sql" ``` ## Notas Crea el directorio si no existe (`os.MkdirAll`). La version se calcula encontrando el maximo numero existente entre los archivos `NNN_*.sql` del directorio y sumando 1. El template generado tiene los marcadores vacios para que el desarrollador complete el SQL. Nombre valido: `^[a-zA-Z][a-zA-Z0-9_]*$` — no puede empezar con numero ni contener espacios o guiones.