Skip to main content

tai-sql

PyPI Python Licencia: propietaria 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

Propietaria: © Triple Alpha Innovation, todos los derechos reservados. Ver LICENSE.


Desarrollado por Triple Alpha Innovation · Issues

Metadata

Release files for tai-sql 0.7.19

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.19
File Size Uploaded Provenance
tai_sql-0.7.19.tar.gz 624.7 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 1.4 MB

Release files / tai_sql-0.7.19.tar.gz

Download URL tai_sql-0.7.19.tar.gz
Size 624.7 kB
Tags Source
SHA-256 checksum
How to use checksums
c2a2567641658d37c1f19976e4f374c847fa08c477c872d061ab0f41d1348ad9
BLAKE2b-256 checksum
How to use checksums
e3ca8a5471389791602348b3d02ce64006a7b66b80cb1f2aaf672c1516a40796
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.19-py3-none-any.whl

Download URL tai_sql-0.7.19-py3-none-any.whl
Size 764.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a65fe41ad61e76f408ac25823bfcdb2a2144c2831f55aa0bb8448f52bb976f81
BLAKE2b-256 checksum
How to use checksums
155bf9b2ba2f2bd7c59a662cc325180a2b07a2cb4b4a8880eae0b060081ca2e3
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

Security for tai-sql 0.7.19

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.7.19 This release

2 release files No provenance

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