Skip to main content

tai-sql

PyPI Python License: MIT Manual

Framework declarativo de Python, sobre SQLAlchemy, que gestiona el ciclo de vida completo de una base de datos. Declaras el modelo una vez, en un fichero Python, y a partir de ahí tai-sql sincroniza la estructura de la base de datos, genera un cliente Python completo —modelos, DTOs y DAOs síncronos y asíncronos— y dibuja el diagrama entidad-relación.

schemas/public.py  ──▶  tai-sql push      ──▶  la base de datos se parece al schema
                   ──▶  tai-sql generate  ──▶  cliente Python + diagrama ER
                   ──▶  tai-sql feed      ──▶  datos iniciales
                   ◀──  tai-sql pull      ◀──  una base de datos que ya existe

Motores soportados: PostgreSQL, MySQL, SQL Server y BigQuery.

📖 El manual completo está en triplealpha-innovation.github.io/tai-sql


Quickstart

pip install tai-sql                       # PostgreSQL funciona sin extras
tai-sql init -n mi_proyecto -s public     # crea el proyecto
cd mi_proyecto
export MAIN_DATABASE_URL="postgresql://user:pass@localhost:5432/mydb"
tai-sql install                           # instala lo que el cliente generado necesitará

Edita schemas/public.py:

# -*- coding: utf-8 -*-
from __future__ import annotations
from tai_sql import *
from tai_sql.generators import *

datasource(provider=env('MAIN_DATABASE_URL'), schema='public', syntax='v2')

generate(
    PythonClientGenerator(output_dir='database'),
    ERDiagramGenerator(output_dir='diagrams', format='html'),
)


class Usuario(Table):
    """Usuarios del sistema."""
    __tablename__ = 'usuario'

    id: col[int] = column(primary_key=True, autoincrement=True)
    nombre: col[str]
    email: col[str] = column(unique=True)
    creado_en: col[datetime] = column(server_now=True)

    posts: onetomany[Post]


class Post(Table):
    """Posts publicados."""
    __tablename__ = 'post'

    id: col[bigint] = column(primary_key=True, autoincrement=True)
    titulo: col[str]
    contenido: col[text]
    autor_id: col[int]

    autor: manytoone[Usuario] = relation(fields=['autor_id'], references=['id'], backref='posts')
tai-sql push --dry-run --verbose   # enseña el DDL sin ejecutar nada
tai-sql push                       # lo aplica y regenera el cliente

Y a usarlo:

from database.public import public_sync_api, UsuarioCreate

usuario = public_sync_api.usuario.create(UsuarioCreate(nombre='Ana', email='ana@example.com'))
usuarios = public_sync_api.usuario.find_many(limit=10, includes=['posts'])

Los cinco principios que explican el resto

  1. El schema es la única fuente de verdad. Todo lo demás —DDL, cliente, diagramas— es derivado y desechable. Si el cliente generado no hace lo que necesitas, no se edita el cliente: se arregla el schema y se regenera.
  2. Mapear y después actuar. Todo comando importa el schema, lo analiza y actúa sobre ese mapeo. Ningún comando parsea el fichero por su cuenta.
  3. El código generado nunca importa tai_sql. tai-sql es una herramienta de desarrollo, no una dependencia de producción: el cliente se despliega donde tai-sql no está instalado.
  4. Modelo declarativo, sin migraciones versionadas. No hay ficheros de migración: push compara el estado declarado con el real y genera el DDL que hace falta.
  5. Definición ≠ runtime. El ORM de tai-sql describe; el comportamiento en producción vive en el código generado.

Qué trae

Schema declarativo Tablas, relaciones, vistas, enumerados, constraints e índices de varias columnas, columnas calculadas y jerarquías. Dos sintaxis, v1 y v2, y las dos se soportan
Sincronización sin migraciones push compara y genera el DDL, clasificando cada operación en SAFE / WARNING / BLOCKED antes de tocar nada
Cliente Python generado CRUD completo, filtros por tipo de columna, relaciones anidadas, agregaciones con GROUP BY, DataFrames, RLS, auditoría y transacciones, en síncrono y asíncrono
Triggers transpilados Lógica de negocio declarada en el schema que se inlinea en los DAOs: sin coste en runtime
Cifrado y vectores Columnas cifradas con Fernet, transparentes al leer, y columnas vectoriales con pgvector y búsqueda por similitud
Diagrama ER Una página HTML interactiva, o una imagen con Graphviz
Introspección pull escribe el schema de una base de datos que ya existe
Reglas para asistentes de IA rules install deja en tu proyecto la documentación que un asistente necesita, incluida la derivada de tu schema

El manual

Sección Qué responde
Instalación Qué instalar, y por qué son dos instalaciones y no una
Tu primer proyecto De cero a un cliente generado funcionando
El schema Todo lo que se puede declarar, y cómo
El CLI Qué hace cada comando, y qué puede destruir push
El cliente generado La API que vas a usar desde tu aplicación
Referencia Firmas del DSL, motores, extensión y catálogo de errores

Desarrollo

git clone https://github.com/triplealpha-innovation/tai-sql
cd tai-sql
poetry install --all-extras        # los extras no son opcionales para la suite

poetry run pytest                            # todo lo que el entorno permita
poetry run pytest -m "not db and not mysql"  # lo que corre sin ninguna base de datos
poetry run pytest -m mysql                   # el ciclo completo contra MySQL

Los tests marcados db necesitan un PostgreSQL alcanzable y se saltan si no lo hay; los marcados mysql, un MySQL en TAI_SQL_MYSQL_URL. Sus schemas salen de tests/fixtures/project/.

El CI tiene tres workflows: tests.yaml ejecuta la suite en cada push y PR a main y dev —un trabajo con PostgreSQL y otro con MySQL—, docs.yaml publica el manual y publish.yaml publica a PyPI en push a main. La rama de trabajo habitual es dev, y la versión se bumpea a mano en pyproject.toml.

El manual, en local

pip install -r docs/requirements.txt
mkdocs serve            # http://127.0.0.1:8000, con recarga en caliente
mkdocs build --strict   # lo mismo que valida el CI

El manual vive en docs/ y es para quien usa tai-sql. Las reglas de diseño internas (.claude/rules/) y el README.md de cada paquete son para quien trabaja en tai-sql, y no se publican: son dos audiencias con preguntas distintas.

El mapa del código

Ruta Qué es
tai_sql/orm/ El mapeo, en cuatro capas: declarative/ → analysis/ → model/ → mapping/
tai_sql/sync/ Sincronización schema ↔ BD: state/ → diff/ → report.py → plan/ → safety.py → executor.py
tai_sql/feed/ Poblar la base de datos: recoger → planificar → aplicar en una transacción
tai_sql/introspect/ La dirección contraria: BD existente → fichero de schema
tai_sql/drivers/ Todo el SQL dialectal, más las capacidades de cada motor
tai_sql/generators/ Cliente Python, diagrama ER y reglas
tai_sql/connection/ Con qué se conecta tai-sql y cómo se conectará el cliente generado
tai_sql/cli/ El CLI de Click
tai_sql/errors/ TaiSqlError (mensaje + solución obligatoria) y su presentador

Cada uno de esos paquetes tiene su propio README.md con el detalle.


Licencia

MIT. Ver LICENSE.


Desarrollado por Triple Alpha Innovation · Issues

Release files for tai-sql 0.7.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tai-sql 0.7.9
File Size Uploaded
tai_sql-0.7.9.tar.gz 602.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tai-sql 0.7.9
File Interpreter ABI Platform
tai_sql-0.7.9-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / tai_sql-0.7.9.tar.gz

Download URL tai_sql-0.7.9.tar.gz
Size 602.3 kB
Tags Source
SHA-256 checksum
How to use checksums
aab96fba81a8a4244432f61384adbbc5253568f15f20a62158a895d131ce6f55
BLAKE2b-256 checksum
How to use checksums
874f715cd2a6eade0de84e817a721e5d8c82394ffb49dfefa6d802017fdcb321
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.5.1 CPython/3.11.0 Linux/6.17.0-1022-azure

Release files / tai_sql-0.7.9-py3-none-any.whl

Download URL tai_sql-0.7.9-py3-none-any.whl
Size 739.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e4f15419099cac5e19985a5d2e0c7e011f617b6f2cad4537ab4a12f66a8daab3
BLAKE2b-256 checksum
How to use checksums
bb961102346da844076c860a06e7b62126cc8126e8fce0d3e80c1c2bba7e0e2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.5.1 CPython/3.11.0 Linux/6.17.0-1022-azure

Release history Release notifications | RSS feed

This release

0.7.9 This release

2 release files

0.7.8

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.38

2 release files

0.6.37

2 release files

0.6.36

2 release files

0.6.35

2 release files

0.6.34

2 release files

0.6.29

2 release files

0.6.28

2 release files

0.6.27

2 release files

0.6.26

2 release files

0.6.25

2 release files

0.6.24

2 release files

0.6.23

2 release files

0.6.22

2 release files

0.6.11

2 release files

0.6.10

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.22

2 release files

0.4.21

2 release files

0.4.20

2 release files

0.4.19

2 release files

0.4.18

2 release files

0.4.17

2 release files

0.4.16

2 release files

0.4.15

2 release files

0.4.14

2 release files

0.4.13

2 release files

0.4.12

2 release files

0.4.11

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.59

2 release files

0.3.58

2 release files

0.3.53

2 release files

0.3.45

2 release files

0.3.44

2 release files

0.3.43

2 release files

0.3.42

2 release files

0.3.41

2 release files

0.3.40

2 release files

0.3.39

2 release files

0.3.38

2 release files

0.3.37

2 release files

0.3.35

2 release files

0.3.34

2 release files

0.3.33

2 release files

0.3.32

2 release files

0.3.31

2 release files

0.3.30

2 release files

0.3.27

2 release files

0.3.26

2 release files

0.3.25

2 release files

0.3.24

2 release files

0.3.23

2 release files

0.3.22

2 release files

0.3.21

2 release files

0.3.19

2 release files

0.3.18

2 release files

0.3.17

2 release files

0.3.16

2 release files

0.3.15

2 release files

0.3.14

2 release files

0.3.13

2 release files

0.3.11

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.15

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.0

2 release files

0.1.20

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page