Spraxium logoSpraxium

CLI Base de datos

Cómo spraxium database hace scaffolding de un módulo completo de integración ORM en segundos. Elige tu ORM y motor de base de datos con el asistente interactivo, y empieza a escribir consultas de inmediato.

Qué hace

spraxium database (alias spraxium db) genera un módulo de base de datos completamente cableado dentro de tu proyecto. Te guía con un asistente interactivo donde seleccionas un ORM y un motor de base de datos; después hace scaffolding de los archivos del módulo, parchea tu configuración de entorno con las claves necesarias, instala los paquetes requeridos y opcionalmente registra el módulo en tu AppModule. Al final del asistente, tu proyecto queda listo para ejecutar consultas sin configuración manual.

El comando acepta un argumento opcional de ORM para omitir el primer paso de selección. Cuando ya sabes lo que quieres, spraxium database prisma salta directamente al prompt del motor de base de datos.

Cuándo usarlo

Usa este comando al inicio de un proyecto o al añadir acceso a base de datos en una aplicación Spraxium existente. Es el equivalente a instalar paquetes manualmente, escribir el boilerplate de conexión y registrar el módulo, todo condensado en un único flujo interactivo. Ejecútalo una vez por integración de base de datos; para cambios de schema o migraciones, usa directamente la herramienta del ORM después de la configuración.

ORMs soportados

Qué hace el asistente

Selección de ORM

Si no pasaste un ORM como argumento de CLI, el asistente muestra una lista interactiva de los cinco ORMs soportados con una descripción corta para cada uno. Navega con las flechas y presiona Enter para confirmar.

Selección de motor de base de datos

Para ORMs que soportan varios motores (Prisma, Drizzle, TypeORM, Mikro-ORM), el asistente pregunta cuál quieres usar. Mongoose omite este paso porque solo apunta a MongoDB.

Nombre del módulo

El asistente pide un nombre de módulo con database como valor por defecto. El nombre se convierte a kebab-case para la carpeta y a PascalCase para los nombres de clase. Un nombre como user-db produce un UserDbModule y un directorio src/modules/user-db/.

Scaffolding de archivos

El CLI descarga la plantilla para la combinación de ORM y motor elegida y escribe los archivos de módulo, servicio, schema y configuración en src/modules/{name}/. También se agrega un archivo de configuración en la raíz (como drizzle.config.ts o prisma/schema.prisma) si el ORM lo requiere.

Inyección de claves de entorno

Las variables de entorno requeridas (DATABASE_URL, DATABASE_PATH, etc.) se añaden automáticamente a tu app.env.ts si todavía no existen. No hace falta edición manual.

Instalación de paquetes

El asistente pregunta si quieres instalar paquetes de inmediato. Al confirmar, ejecuta el package manager detectado para añadir dependencias de runtime (como el cliente ORM y driver de base de datos) y dependencias de desarrollo (herramientas CLI, definiciones de tipos). También se ejecutan automáticamente comandos post-instalación como npx prisma generate.

Registro en AppModule

Si se encuentra un app.module.ts en tu directorio src/, el asistente ofrece añadir automáticamente el módulo generado al array imports. Esto conecta el módulo al contenedor de DI para que puedas inyectar DatabaseService en cualquier parte de la aplicación.

Estructura de archivos generada

Los archivos exactos varían según el ORM, pero la estructura sigue la misma convención para cada combinación.

project structure
database.module.ts
database.service.ts
database.schema.ts

También se crean archivos de configuración en la raíz

Algunos ORMs requieren un archivo de configuración en la raíz del proyecto. Prisma genera un directorio prisma/ con schema.prisma. Drizzle genera drizzle.config.ts. Estos archivos se escriben junto a los del módulo y deben versionarse.

Después del asistente

Cuando el comando termina, puedes inyectar DatabaseService en cualquier handler, guard o servicio dentro del mismo alcance de módulo. El servicio se exporta desde el módulo de base de datos, así que al importar DatabaseModule en cualquier otro módulo obtienes acceso a través del contenedor de DI.

src/modules/hello/hello.service.ts
import { Injectable } from '@spraxium/common';
import { DatabaseService } from '../database/database.service';

@Injectable()
export class HelloService {
  constructor(private readonly db: DatabaseService) {}

  async getCount(): Promise<number> {
    // Use the ORM client returned by the service
    return this.db
      .getDb()
      .select()
      .from(table)
      .then((rows) => rows.length);
  }
}