feat: funciones impuras migration_create, migration_up, migration_down, migration_status
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>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user