9b0e1f836d
Fase 2 del issue 0015. MigrationCreate (crea archivo .sql template con version auto-calculada), MigrationUp (aplica migraciones pendientes en transacciones individuales), MigrationDown (revierte ultimas N via down_sql de _migrations), MigrationGetStatus (cruza disco con BD, detecta orphaned). Tests de integracion: ciclo completo create->up->status->down->status. 26 tests, todos pasan. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
2.1 KiB
Markdown
56 lines
2.1 KiB
Markdown
---
|
|
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.
|