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.8

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.8
File Size Uploaded
tai_sql-0.7.8.tar.gz 599.7 kB Details

Built distribution (wheel)

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

Total release size: 1.3 MB

Release files / tai_sql-0.7.8.tar.gz

Download URL tai_sql-0.7.8.tar.gz
Size 599.7 kB
Tags Source
SHA-256 checksum
How to use checksums
14fa86c33796142acd390d06bc953d8b46b7a49e5c68d759ba7bd8e01214ec50
BLAKE2b-256 checksum
How to use checksums
bf3ec2227ebe90147fae20fe29f4dec75c74480f071665bb5d6f63de9147e342
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.8-py3-none-any.whl

Download URL tai_sql-0.7.8-py3-none-any.whl
Size 736.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
04805e8477321e3b55c164a8e450793e845d38d5048503ff3315391a3377a2b5
BLAKE2b-256 checksum
How to use checksums
59e59206e798383a681679e49476dbdb7e17504068659ed4c7a56a301c2eb899
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

0.7.9

2 release files

This release

0.7.8 This release

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