Saltar a contenido

tai-sql generate

tai-sql generate [-s <schema>]

Ejecuta los generadores que declare el generate(...) del schema. No toca la base de datos y no necesita conexión: solo necesita poder importar el schema, así que las variables de entorno del env(...) tienen que existir, aunque no apunten a nada real.

Qué produce PythonClientGenerator

Escribe en <output_dir>/<schema>/:

<schema>/
├── __init__.py       fachada: <schema>_sync_api, <schema>_async_api, DTOs, modelos
├── _base.py          declarative base, cifrado si aplica
├── _session.py       gestión de sesiones y pool
├── _shared/          utilidades comunes: agregaciones, RLS, contexto de usuario
└── <tabla>/
    ├── model.py      modelo SQLAlchemy
    ├── dtos.py       DTOs Pydantic: Read, Create, Filter, Update…
    ├── dao_sync.py   operaciones síncronas
    └── dao_async.py  operaciones asíncronas

Todo ese directorio es desechable

Se borra y se regenera. Editarlo a mano no tiene sentido: la siguiente generación lo pisa. Si el cliente no hace lo que necesitas, el cambio va en el schema.

Ver El cliente generado.

Qué produce ERDiagramGenerator

Escribe <output_dir>/<schema>.<format> y dibuja tablas, vistas, columnas con sus marcadores, enumerados con sus valores y qué columna los usa, las UNIQUE e índices de varias columnas, las jerarquías y las relaciones con su cardinalidad. Cada bloque se apaga con su include_*.

Una página interactiva: un único fichero que se abre con doble clic, con buscador de tablas y columnas, panel de detalle con triggers y restricciones, filtros en vivo y tablas que se arrastran.

No necesita Graphviz ni conexión: la librería del diagrama viaja incrustada (~370 KB). Con assets='cdn' se enlaza en su lugar y el fichero queda en unas decenas de KB, pero entonces necesita internet para abrirse.

svg, png, pdf, dot, eps, ps, con Graphviz. Necesita el extra diagrams y el binario dot instalado en el sistema.

Ahí sí aplican lines ('ortho', 'polyline', 'spline', 'curved'), size y dpi.

Los dos formatos se pueden declarar a la vez, cada uno con su output_dir:

generate(
    ERDiagramGenerator(output_dir='diagrams', format='html'),
    ERDiagramGenerator(output_dir='docs/img', format='svg'),
)

Varios destinos

output_dir acepta una lista, y el generador escribe lo mismo en todos:

PythonClientGenerator(output_dir=['database', '../otro-servicio/database'])

Determinismo

Dos ejecuciones del mismo schema producen exactamente el mismo output, byte a byte. Eso es lo que permite versionar el cliente generado sin que cada generate ensucie el diff.

Generadores propios

generate() acepta cualquier subclase de BaseGenerator, también la tuya. Ver extender tai-sql.