SQLCute — Constructor Fluido de SQL para Delphi

🌍 Idioma: English | Español

Construye consultas SQL con una API fluida, segura en tipos. Sin concatenación de cadenas, sin SQL crudo — solo encadenamiento de métodos que compila a SQL parametrizado.

Delphi 12+ Licencia


Conceptos

Concepto Descripción
IQuery Interfaz fluida — cada método devuelve IQuery para encadenamiento
TQuery.New Punto de entrada — crea una query con conteo de referencias, sin necesidad de Free
TSQLResult Resultado: cadena SQL + array Bindings de parámetros posicionales
IQueryCompiler Estrategia para generación de SQL específica del dialecto (ANSI por defecto, o un compilador de dialecto)

Inicio Rápido

uses Daf.SQLCute;

var Q := TQuery.New
  .From('pedidos')
  .Select(['id', 'total', 'estado'])
  .Where('estado', 'pendiente')
  .Where('total', '>', 100)
  .OrderByDesc('creado_en')
  .Limit(20);

var R := TAnsiSqlCompiler.Create.Compile(Q);
// R.SQL      → 'SELECT id, total, estado FROM pedidos WHERE estado = ? AND total > ? ORDER BY creado_en DESC LIMIT 20'
// R.Bindings → ['pendiente', 100]

Patrones Comunes

Filtrar y paginar

TQuery.New
  .From('usuarios')
  .Where('activo', True)
  .ForPage(Pagina, 25)   // LIMIT 25 OFFSET (Pagina-1)*25

JOIN

TQuery.New
  .From('pedidos')
  .Join('clientes', 'pedidos.cliente_id', 'clientes.id')
  .Select(['pedidos.id', 'clientes.nombre'])

Agregación

TQuery.New
  .From('ventas')
  .GroupBy('producto_id')
  .SelectCount('*', 'qty')
  .SelectSum('importe', 'total')
  .Having('count(*)', '>', 10)

DML

// INSERT
TQuery.New.From('logs')
  .AsInsert(['nivel', 'mensaje'], ['error', 'disco lleno']);

// UPDATE
TQuery.New.From('usuarios')
  .Where('id', 42)
  .AsUpdate(['email'], ['nuevo@ejemplo.com']);

// DELETE
TQuery.New.From('sesiones')
  .Where('expirado', True)
  .AsDelete;

Compilador de dialecto

uses Daf.SQLCute.Compiler.Postgres;

var R := TPostgresCompiler.Create.Compile(Q);
// identificadores entrecomillados con "", marcadores $1 $2 …

Documentación

Recurso Descripción
Guía de Uso Referencia completa de la API con todos los métodos
SELECT & FROM Columnas, DISTINCT, agregados, ORDER BY, LIMIT
WHERE Condiciones, IN, EXISTS, grupos, LIKE, operaciones de fecha
JOINs Todos los tipos de join y callbacks
GROUP BY / HAVING Agrupación y filtros de agregados
Operaciones de Conjunto UNION, INTERSECT, EXCEPT, paginación
DML INSERT, UPDATE, DELETE
Subconsultas y CTEs Tablas derivadas, WITH, CTEs recursivos
Operaciones de Cadena LIKE, starts/ends/contains
Operaciones de Fecha WhereDate, casting por dialecto
Compiladores de Dialecto Postgres, MySQL, SQLite, SQL Server, Oracle, Firebird
Paquete Compilers Clases de compiladores de dialecto

Compiladores

SQLCute.Compilers — Compiladores de Dialecto

🌍 Idioma: English | Español

Compiladores SQL específicos de dialecto para SQLCute. Cada compilador extiende la base ANSI con entrecomillado de identificadores, marcadores de parámetros, cast de fechas y paginación nativos de cada base de datos.

Delphi 12+ Licencia


Compiladores Disponibles

Clase Unidad Comillas Marcador Notas
TPostgresCompiler Daf.SQLCute.Compiler.Postgres " $1, $2 Cast ::date
TMySqlCompiler Daf.SQLCute.Compiler.MySql ` ? Cast DATE(col)
TSQLiteCompiler Daf.SQLCute.Compiler.SQLite " ? date(col) / strftime
TSqlServerCompiler Daf.SQLCute.Compiler.SqlServer [] @p1, @p2 Paginación FETCH NEXT
TOracleCompiler Daf.SQLCute.Compiler.Oracle " :p1, :p2 Cast TRUNC(col), paginación FETCH
TFirebirdCompiler Daf.SQLCute.Compiler.Firebird " ? Partes de fecha con EXTRACT

El compilador base ANSI (TAnsiSqlCompiler) vive en el paquete núcleo de SQLCute (Daf.SQLCute.Compiler).


Ejemplo Rápido

uses
  Daf.SQLCute,
  Daf.SQLCute.Compiler.Postgres;

var Q := TQuery.New
  .From('pedidos')
  .Join('clientes', 'pedidos.cliente_id', 'clientes.id')
  .Where('pedidos.estado', 'pendiente')
  .WhereDate('pedidos.creado_en', '2024-06-01')
  .OrderByDesc('pedidos.creado_en')
  .Limit(50);

var R := TPostgresCompiler.Create.Compile(Q);
// R.SQL →
//   SELECT * FROM "pedidos"
//   INNER JOIN "clientes" ON "pedidos"."cliente_id" = "clientes"."id"
//   WHERE "pedidos"."estado" = $1
//     AND "pedidos"."creado_en"::date = $2
//   ORDER BY "pedidos"."creado_en" DESC
//   LIMIT 50

Documentación