---
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, pendiente-usar]
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.
