Generador de Migración Prisma Schema a SQL DDL

Generador de Migración Prisma Schema a SQL DDL

Guía técnica para convertir esquemas de Prisma a sentencias SQL DDL compatibles con PostgreSQL, MySQL y SQLite.

Preajustes:
Dialecto Objetivo:
Definición de Esquema Prisma(4 modelos, 2 enums)
-- ============================================================================
-- ToolsAA Prisma to SQL DDL Generator
-- Target Dialect: POSTGRESQL
-- Generated via ToolsAA Prisma-to-SQL Engine
-- 100% Pure Client-Side Browser Compilation
-- ============================================================================

-- ----------------------------------------------------------------------------
-- Drop Existing Tables
-- ----------------------------------------------------------------------------
DROP TABLE IF EXISTS "user_sessions" CASCADE;
DROP TABLE IF EXISTS "memberships" CASCADE;
DROP TABLE IF EXISTS "users" CASCADE;
DROP TABLE IF EXISTS "organizations" CASCADE;

-- ----------------------------------------------------------------------------
-- Custom Enum Types
-- ----------------------------------------------------------------------------
DROP TYPE IF EXISTS "Role";
CREATE TYPE "Role" AS ENUM ('SUPERADMIN', 'ADMIN', 'MEMBER', 'VIEWER');
DROP TYPE IF EXISTS "MemberStatus";
CREATE TYPE "MemberStatus" AS ENUM ('INVITED', 'ACTIVE', 'SUSPENDED');

-- ----------------------------------------------------------------------------
-- Table Definitions
-- ----------------------------------------------------------------------------
CREATE TABLE "organizations" (
  "id" UUID NOT NULL DEFAULT 'uuid(',
  "name" VARCHAR(128) NOT NULL,
  "slug" VARCHAR(64) NOT NULL UNIQUE,
  "domain" VARCHAR(128),
  "createdAt" TIMESTAMPTZ NOT NULL DEFAULT 'now(',
  "updatedAt" TIMESTAMPTZ NOT NULL,
  PRIMARY KEY ("id")
);

CREATE TABLE "users" (
  "id" UUID NOT NULL DEFAULT 'uuid(',
  "email" VARCHAR(255) NOT NULL UNIQUE,
  "fullName" VARCHAR(128) NOT NULL,
  "avatarUrl" VARCHAR(512),
  "emailVerified" TIMESTAMPTZ,
  "isActive" BOOLEAN NOT NULL DEFAULT true,
  "createdAt" TIMESTAMPTZ NOT NULL DEFAULT 'now(',
  "updatedAt" TIMESTAMPTZ NOT NULL,
  PRIMARY KEY ("id")
);

CREATE TABLE "memberships" (
  "id" UUID NOT NULL DEFAULT 'uuid(',
  "organizationId" UUID NOT NULL,
  "userId" UUID NOT NULL,
  "role" "Role" NOT NULL DEFAULT 'MEMBER',
  "status" "MemberStatus" NOT NULL DEFAULT 'ACTIVE',
  "joinedAt" TIMESTAMPTZ NOT NULL DEFAULT 'now(',
  PRIMARY KEY ("id"),
  UNIQUE ("organizationId", "userId")
);

CREATE TABLE "user_sessions" (
  "id" UUID NOT NULL DEFAULT 'uuid(',
  "sessionToken" VARCHAR(255) NOT NULL UNIQUE,
  "userId" UUID NOT NULL,
  "ipAddress" VARCHAR(45),
  "userAgent" VARCHAR(512),
  "expiresAt" TIMESTAMPTZ NOT NULL,
  "createdAt" TIMESTAMPTZ NOT NULL DEFAULT 'now(',
  PRIMARY KEY ("id")
);

-- ----------------------------------------------------------------------------
-- Foreign Key Constraints
-- ----------------------------------------------------------------------------
ALTER TABLE "memberships" ADD CONSTRAINT fk_memberships_organizationId FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE;
ALTER TABLE "memberships" ADD CONSTRAINT fk_memberships_userId FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE;
ALTER TABLE "user_sessions" ADD CONSTRAINT fk_user_sessions_userId FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE;

-- ----------------------------------------------------------------------------
-- Secondary Indexes
-- ----------------------------------------------------------------------------
CREATE INDEX "idx_memberships_userId" ON "memberships" ("userId");
CREATE INDEX "idx_user_sessions_userId_expiresAt" ON "user_sessions" ("userId", "expiresAt");
4
Modelos Analizados
27
Columnas y Atributos
100%
SQL Ejecutable Listo

Compilación Instantánea de Esquemas

Analiza modelos de Prisma, claves compuestas y tipos nativos en la memoria de su navegador sin latencia de red.

Privacidad 100% en el Cliente

Sus esquemas de bases de datos nunca salen de su navegador. Cero transmisiones a servidores externos.

Soporte Multi-Dialecto SQL

Generación DDL adaptada para PostgreSQL, MySQL, SQLite y SQL Server con tipos de datos específicos.

Referencia técnica y guía de arquitectura

Generador de Migración Prisma Schema a SQL DDL — Guía de referencia

Guía técnica para convertir esquemas de Prisma a sentencias SQL DDL compatibles con PostgreSQL, MySQL y SQLite.

Parámetros clave y controles

dialectSqlDialect (postgresql | mysql | sqlite | sqlserver)

Dialecto SQL de destino que rige el mapeo de tipos de datos, delimitadores de identificadores y estrategias de enum.

Por defecto: postgresql
dropTableIfExistsboolean

Antepone sentencias DROP TABLE IF EXISTS (y DROP TYPE en PostgreSQL) para permitir migraciones idempotentes y repetibles.

Por defecto: true
includeForeignKeysboolean

Genera restricciones FOREIGN KEY a partir de campos @relation en Prisma, mapeando acciones onDelete y onUpdate.

Por defecto: true
separateAlterFkboolean

Emite restricciones de clave foránea mediante sentencias ALTER TABLE posteriores en lugar de inline, evitando bloqueos por dependencia circular.

Por defecto: true
includeIndexesboolean

Produce sentencias CREATE INDEX y CREATE UNIQUE INDEX explícitas para atributos @@index y @@unique compuestos de Prisma.

Por defecto: true
quoteIdentifiersboolean

Envuelve identificadores de tablas, columnas y restricciones en comillas específicas del motor para evitar conflictos con palabras reservadas.

Por defecto: true

Consejos profesionales y mejores prácticas

Separar claves foráneas con ALTER

Active separateAlterFk para esquemas con relaciones cíclicas entre modelos. Aplicar restricciones después de todos los CREATE TABLE evita fallos de orden de dependencia durante la ejecución de migraciones.

Manejo de CUID y NanoID en SQL

Las funciones @default(cuid()) o @default(nanoid()) operan en el runtime de JavaScript y carecen de valor por defecto nativo en SQL. Mapee estas columnas a VARCHAR(30) o migre a @default(uuid()) para generación nativa.

Tipos nativos con atributos @db

Los tipos genéricos String y DateTime se asignan a TEXT o TIMESTAMP por defecto. Aplique atributos como @db.VarChar(255), @db.Timestamptz o @db.Decimal(12, 2) para emitir DDL estrictamente optimizado.

Trigger updatedAt en PostgreSQL

Mientras que MySQL gestiona @updatedAt mediante ON UPDATE CURRENT_TIMESTAMP, PostgreSQL requiere un trigger procedimental. Combine el DDL generado con una función trigger PL/pgSQL BEFORE UPDATE para actualizar marcas temporales.

Errores comunes y solución de problemas

Fallo al crear clave foránea con error relation does not exist

Ocurre cuando una restricción foránea inline referencia una tabla creada más adelante en el script. Active separateAlterFk para desacoplar la creación de tablas de la vinculación de restricciones.

La migración de PostgreSQL falla con type already exists al reejecutar

Habilite dropTableIfExists para incluir DROP TYPE IF EXISTS junto con DROP TABLE, o envuelva la creación de tipos en bloques DO $$ BEGIN ... EXCEPTION WHEN duplicate_object THEN null; END $$.

SQLite rechaza la instrucción ALTER TABLE ADD CONSTRAINT FOREIGN KEY

SQLite no admite añadir claves foráneas a tablas existentes mediante ALTER TABLE. En SQLite, declare las restricciones inline en CREATE TABLE o emplee tablas temporales para recrear el esquema.

Preguntas frecuentes (FAQ)

¿Puede ejecutarse el DDL SQL generado directamente en pipelines de CI/CD sin Prisma CLI?▼

Sí. El script generado consta de sentencias DDL estándar e independientes compatibles con herramientas de migración como Flyway, Liquibase, golang-migrate y clientes psql o mysql.

¿Qué estructuras SQL representan las relaciones implícitas de muchos a muchos de Prisma?▼

Cuando dos modelos definen relaciones de lista mutuas sin un modelo intermedio explícito, el generador sintetiza la tabla de unión canónica _ModelAToModelB con claves primarias compuestas y claves foráneas en cascada.

¿Se transmite o almacena información de esquemas o credenciales en servidores remotos?▼

No. El análisis AST, la resolución relacional y la serialización SQL se ejecutan al 100% en la memoria local del navegador web mediante JavaScript. Ningún dato abandona su equipo de desarrollo.

¿Qué sintaxis SQL representa las restricciones únicas compuestas y claves primarias múltiples?▼

Los atributos @@id se transforman en cláusulas PRIMARY KEY (col1, col2) a nivel de tabla, mientras que @@unique se compila en sentencias CREATE UNIQUE INDEX o restricciones de tabla según el motor SQL destino.

Herramientas y utilidades relacionadas

Todas las herramientas →
Guía de Desarrollo: Generador de Interfaces y Tipos TypeScript desde Prisma SchemaDesarrollo

Extrae modelos, enums, campos opcionales y relaciones de Prisma Schema en interfaces TypeScript independientes sin depender del runtime de Prisma Client.

Abrir herramienta→
Guía de Desarrollo: Generador de Clientes API Axios TypeScript desde OpenAPI y SwaggerDesarrollo

Genere funciones de cliente HTTP Axios e interfaces de parámetros con seguridad de tipos estricta a partir de especificaciones OpenAPI 3.0 y Swagger JSON/YAML.

Abrir herramienta→
Guía del Desarrollador del Generador de Clientes TypeScript con Fetch Nativo desde OpenAPI y SwaggerDesarrollo

Genere métodos de API en TypeScript con fetch nativo sin dependencias, serialización de consultas, cabeceras y tipos de respuesta.

Abrir herramienta→
Guía del Desarrollador del Generador de DDL SQL CREATE TABLE desde Esquemas Drizzle ORMDesarrollo

Convierta definiciones pgTable, mysqlTable y sqliteTable de Drizzle ORM en scripts de migración ejecutables SQL CREATE TABLE con total precisión.

Abrir herramienta→
Guía del generador de flujos de trabajo YAML para GitHub Actions CI/CDDesarrollo

Cree canalizaciones de flujos de trabajo YAML de GitHub Actions listas para producción para Node.js, Go, Python, compilaciones de Docker, pruebas y lanzamientos automatizados.

Abrir herramienta→
Generador de Configuraciones Linux Logrotate (Retención y Compresión)Desarrollo

Genere archivos de configuración para /etc/logrotate.d/ listos para producción con rotación diaria/semanal, compresión gzip, dateext, límites de tamaño y scripts postrotate.

Abrir herramienta→