v0.2.0 motor · desktop-v0.1.0 modeler · 841 tests verdes · 2026-06-18

Una base de datos relacional
en un solo archivo.

Motor SQL clásico escrito desde cero en Rust. WAL + B+Tree real + CRC32 por página. Single-file portable (.db + .wal). Sin C en el core, sin servidor obligatorio, sin dependencias runtime. SAVEPOINT, cross-request tx HTTP, planner cost-based con stats persistidas, y 500M+ queries random de fuzz limpio sobre el parser.

Windows Linux / macOS · descargar tar.gz
iwr https://raw.githubusercontent.com/vladimiracunadev-create/gabysql/main/scripts/install.ps1 | iex

PowerShell · sin admin · agrega al PATH del usuario · verifica SHA256.

gabysql repl demo.db
-- Bloques cerrados: E/F/T/J/G/H/I/K/L/V/W/X/Y/Z/P + R/M (sesiones 06-15)
CREATE TABLE ventas (
  id INT PRIMARY KEY,
  region TEXT NOT NULL,
  monto INT,
  fecha DATE
);
OK

BEGIN;
INSERT INTO ventas (id, region, monto, fecha) VALUES
  (1, 'norte', 100, '2026-01-15'),
  (2, 'sur',   250, '2026-01-20'),
  (3, 'sur',   180, '2026-02-03')
ON CONFLICT (id) DO UPDATE SET monto = 0
RETURNING id, region;
OK (3 filas insertadas)
┌────┬────────┐
│ id │ region │
├────┼────────┤
│  1 │ norte  │
│  2 │ sur    │
│  3 │ sur    │
└────┴────────┘

SAVEPOINT antes_de_ajuste;
UPDATE ventas SET monto = monto + 50 WHERE region = 'sur';
OK (2 filas actualizadas)
ROLLBACK TO SAVEPOINT antes_de_ajuste;       -- M12 (ANSI SQL:2003)
OK

SELECT region, SUM(monto) AS total
  FROM ventas
 WHERE monto IS NOT NULL AND region LIKE '%r%'
 GROUP BY region
HAVING SUM(monto) > 100;
┌────────┬───────┐
│ region │ total │
├────────┼───────┤
│ sur    │   430 │
└────────┴───────┘

COMMIT;
OK
841tests verdes (integration + 3 redes property-based + 13 E2E HTTP)
93ADRs documentando decisiones de diseño
503.8 Mqueries random de fuzz limpio en parser
3OS soportados (Win/Linux/macOS)

Qué sabe hacer hoy

Superficie SQL relacional clásica completa. Pensada para OLTP, scripts y embebidos — no para OLAP ni analytics distribuido.

DDL completo

CREATE TABLE con PK, NOT NULL, UNIQUE, DEFAULT, REFERENCES con ON DELETE RESTRICT/CASCADE. ALTER TABLE ADD COLUMN. CREATE [UNIQUE] INDEX. TRUNCATE.

DML completo

Multi-row INSERT, INSERT...SELECT, UPSERT (ON CONFLICT DO NOTHING/UPDATE), REPLACE INTO, RETURNING *. UPDATE/DELETE con WHERE completo, multi-fila, por subquery.

WHERE expresivo

Todos los operadores: =, <, >, <=, >=, <>, BETWEEN, LIKE con escape, IS NULL, IN, EXISTS. Combinaciones con AND/OR/NOT + paréntesis. 3VL ANSI.

JOINs ANSI

INNER, LEFT, RIGHT, FULL, CROSS, USING, NATURAL, multi-tabla, self-join. Index-loop optimization transparente para INNER/LEFT contra PK/índice del right.

Agregados + GROUP BY

COUNT(*), COUNT(DISTINCT col), SUM, AVG, MIN, MAX. GROUP BY multi-columna, HAVING con agregados directos o por alias, SELECT DISTINCT. Reporting básico cubierto.

Transacciones + SAVEPOINT

BEGIN / COMMIT / ROLLBACK explícitos + SAVEPOINT / ROLLBACK TO SAVEPOINT / RELEASE (ANSI). WAL con CRC32 por página + replay completo en cada arranque. Backup/restore/verify con checksum end-to-end via CLI. Sessions cross-request en server HTTP — ORMs pueden hacer BEGIN/INSERT/INSERT/COMMIT a través de N requests.

Planner cost-based

Stats persistidas en catálogo (ANALYZE TABLE): row count, NDV vía HyperLogLog, MCV top-K, histograma equi-depth. Cost-based skip-index calibrado contra bench real (10% break-even). EXPLAIN anota algoritmo de JOIN (index-loop / hash / nested) y EXPLAIN ANALYZE compara estimación vs realidad con clasificación de bias.

Tipos extendidos

DECIMAL(p,s) exacto i128, BLOB, UUID, TIME, DATETIME, VARCHAR(n) con enforcement, INT widths (TINYINT/SMALLINT/BIGINT) y UNSIGNED. Aritmética exacta sobre DECIMAL.

CTEs + Window functions

WITH / WITH RECURSIVE (fixpoint hasta 10K iters), ROW_NUMBER / RANK / DENSE_RANK / LAG / LEAD / FIRST_VALUE / LAST_VALUE + SUM/AVG/MIN/MAX/COUNT OVER (PARTITION BY ... ORDER BY ...) en O(n) por partition.

Procedural + Triggers

CREATE TRIGGER BEFORE/AFTER INSERT/UPDATE/DELETE con bodies multi-statement. CREATE PROCEDURE + CALL. CREATE FUNCTION escalar invocable en SELECT/WHERE. PL/pgSQL completo: IF/CASE/WHILE/FOR/LOOP/DECLARE/RAISE/EXCEPTION/RETURN.

Seguridad (RLS + auth)

CREATE USER con PBKDF2/scrypt/Blake2b, GRANT/REVOKE, SET SESSION AUTHORIZATION. Row-Level Security: CREATE POLICY con USING + WITH CHECK. RETURNING filtrado contra policies SELECT. Audit log con razón semántica.

Cinco modos de uso, un solo motor

📟 CLI
Scripts, automatización, REPL interactivo.
gabysql exec mi.db "SELECT ...;"
🌐 HTTP server
App que conecta por red, multi-cliente. 19 endpoints (Tx M13 + catalog listing).
gabysql-server -db mi.db -addr :8080
📦 Crate Rust
App Rust nativa, embebido, cero red.
use gabysql::{sql, storage};
🐳 Docker
Demo rápida con UI web (phpgabyadmin + gabymodeler).
docker compose up -d
🖥 Desktop app
nuevo — modelador ER con instalador Windows + server local sidecar.
gabymodeler.msi · doble-click un .gby

🖥 gabymodeler Desktop — el modelador ER profesional

Empaquetado con Tauri 1.6 + WebView2 + gabysql-server como sidecar local. Bundle 10-15 MB. Cero setup: sin Docker, sin PHP, sin Python externo. Doble-click un archivo .gby y la app abre el modelo.

Modelado ER completo

Entidades + FK Bezier · tipos extendidos (DECIMAL/BLOB/UUID/VARCHAR/INT widths/UNSIGNED) · CHECK inline · composite PK/UNIQUE/INDEX · Views · RLS Policies (USING+CHECK) · Triggers · Procedures · Functions · Users · Roles · Grants. 1:1 con motor VERSION 33.

Canvas profesional

Zoom-to-cursor (Ctrl+Wheel) · pan middle-click/Alt · fit-all · minimap navegable · multi-selección con lasso · drag-to-create FK (arrastrá del flag FK al PK target) · atajos +/-/0/F.

Undo/Redo + atajos universales

History stack 50 entries. Ctrl+Z, Ctrl+Y, Ctrl+A (select all), Ctrl+D (duplicate), Delete, Ctrl+F (búsqueda global tipo VSCode command palette).

Save/Load .gby + Export

Formato wrapper {format, version, state} persistente. Export SVG standalone (editable en Figma) + Export PNG 2x para retina. Asociación .gby registrada por el instalador.

Migrations diff → ALTER

Comparás el modelo actual contra un snapshot anterior (.gby o pegado) y obtenés los CREATE/ALTER/DROP exactos para llegar de uno al otro. Granular por column/check/view/policy/grant/routine.

Auto-layout + Reverse engineering

Algoritmo Fruchterman-Reingold acomoda N tablas con sus FK automáticamente. Reverse engineering: apuntás a un gabysql-server y trae todo el catálogo (tablas + views + policies + triggers + procs + funcs + users + roles + grants).

Windows · .msi macOS / Linux · próximo

⬇ Descargar gabymodeler 0.1.0 para Windows · sin admin · sin signing aún (SmartScreen pide confirmación 1 vez) · workspace en %APPDATA%.

¿Dónde encaja?

Sí, para esto

  • Apps Rust embebidas que necesitan SQL real (no un KV).
  • OLTP clásico: lookups por PK + índices + JOINs equi-predicado.
  • Reporting con GROUP BY + agregados, JOINs, window functions, CTEs.
  • Cómputo financiero con DECIMAL(p,s) exacto (i128, sin lossy float).
  • Apps multi-tenant con Row-Level Security + audit log con razón semántica.
  • ORMs (SQLAlchemy/Diesel/Hibernate) via HTTP — sessions cross-request soportadas.
  • Proyectos que valoran supply chain Rust pura (zero deps en el core).
  • Casos donde SQLite es restrictivo pero Postgres es overkill.

No (todavía)

  • OLAP analítico — DuckDB es la respuesta.
  • MVCC / multi-writer concurrente — Postgres. Single-writer estricto por diseño.
  • Múltiples sesiones tx HTTP concurrentes (single-slot por ahora — depende de WAL-mode opt-in).
  • Compatibilidad wire-protocol con Postgres/MySQL (REST/JSON HTTP propio).
  • UPDATE ... FROM, EXCLUDED.col en UPSERT, multi-col ORDER BY.

Documentación