Générateur de Migration Prisma Schema vers SQL DDL

Générateur de Migration Prisma Schema vers SQL DDL

Guide technique pour convertir des schémas Prisma en scripts SQL DDL compatibles PostgreSQL, MySQL et SQLite.

Préréglages :
Dialecte Cible:
Définition de Schéma Prisma(4 modèles, 2 énumérations)
-- ============================================================================
-- 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
Modèles Analysés
27
Colonnes et Attributs
100%
SQL Prêt à l'Exécution

Compilation Instantanée du Schéma

Analyse les modèles Prisma, clés composites et types natifs directement dans la mémoire de votre navigateur.

Confidentialité 100% Locale

Vos schémas de base de données et architectures propriétaires ne quittent jamais votre navigateur.

Support Multi-Dialecte SQL

Génération DDL sur mesure pour PostgreSQL, MySQL, SQLite et SQL Server avec types et contraintes adaptés.

Référence technique et guide d'architecture

Générateur de Migration Prisma Schema vers SQL DDL — Guide de référence

Guide technique pour convertir des schémas Prisma en scripts SQL DDL compatibles PostgreSQL, MySQL et SQLite.

Paramètres clés et contrôles

dialectSqlDialect (postgresql | mysql | sqlite | sqlserver)

Dialecte SQL cible pilotant le mappage des types de données, les délimiteurs d identificateurs et la génération des enums.

Par défaut : postgresql
dropTableIfExistsboolean

Préfixe les instructions avec DROP TABLE IF EXISTS (et DROP TYPE sous PostgreSQL) pour créer des scripts de migration idempotents.

Par défaut : true
includeForeignKeysboolean

Génère les contraintes FOREIGN KEY déduites des champs @relation de Prisma avec les actions onDelete et onUpdate associées.

Par défaut : true
separateAlterFkboolean

Génère les contraintes de clés étrangères sous forme d instructions ALTER TABLE séparées pour éliminer les deadlocks de dépendances circulaires.

Par défaut : true
includeIndexesboolean

Produit des instructions explicites CREATE INDEX et CREATE UNIQUE INDEX pour les attributs @@index et @@unique composites de Prisma.

Par défaut : true
quoteIdentifiersboolean

Entoure les noms de tables, colonnes et contraintes de guillemets spécifiques au SGBD afin d éviter les conflits de mots réservés.

Par défaut : true

Conseils de pro et bonnes practices

Clés étrangères via ALTER TABLE

Activez separateAlterFk lors de la manipulation de modèles interconnectés avec des dépendances cycliques. L émission des contraintes après l ensemble des CREATE TABLE évite les erreurs d ordre d exécution.

Gestion des CUID et NanoID en SQL

Les fonctions Prisma @default(cuid()) ou @default(nanoid()) sont exécutées dans le runtime JavaScript sans équivalent SQL natif. Utilisez VARCHAR(30) ou basculez sur @default(uuid()) pour une génération native.

Types natifs avec attributs @db

Les champs génériques String et DateTime sont mappés par défaut sur TEXT ou TIMESTAMP. Ajoutez des attributs tels que @db.VarChar(255), @db.Timestamptz ou @db.Decimal(12, 2) pour un DDL précis et optimisé.

Trigger updatedAt sous PostgreSQL

Tandis que MySQL prend en charge @updatedAt via ON UPDATE CURRENT_TIMESTAMP, PostgreSQL requiert un trigger procédural. Associez le DDL généré à une fonction trigger PL/pgSQL BEFORE UPDATE.

Pièges courants et dépannage

Échec de création de clé étrangère avec erreur relation does not exist

Cette anomalie survient lorsqu une clé étrangère inline cible une table déclarée plus bas dans le script. Activez separateAlterFk pour découpler la création des tables de l application des contraintes.

La migration PostgreSQL échoue avec type already exists lors d une réexécution

Activez dropTableIfExists pour insérer DROP TYPE IF EXISTS avant la recréation, ou encapsulez les enums dans un bloc DO $$ BEGIN ... EXCEPTION WHEN duplicate_object THEN null; END $$.

SQLite rejette l instruction de contrainte ALTER TABLE ADD CONSTRAINT FOREIGN KEY

SQLite n autorise pas l ajout de clés étrangères a posteriori via ALTER TABLE. Sous SQLite, déclarez les contraintes inline au sein du CREATE TABLE ou réalisez la migration à l aide d une table temporaire.

Foire aux questions (FAQ)

Le DDL SQL généré peut-il être exécuté directement dans les pipelines CI/CD de production sans Prisma CLI ?▼

Oui. Le code SQL généré est constitué d instructions DDL autonomes compatibles avec les moteurs de migration comme Flyway, Liquibase, golang-migrate, ainsi que les invites psql et mysql.

Quelles structures SQL traduisent les relations many-to-many implicites de Prisma ?▼

Lorsque deux modèles déclarent des listes relationnelles sans entité pivot explicite, le générateur synthétise la table de jointure standard _ModelAToModelB avec clés primaires composites et clés étrangères en cascade.

Les définitions de schéma ou informations d identification sont-elles transmises à des serveurs distants ?▼

Non. Le parseur AST, la résolution des relations et l émetteur SQL fonctionnent à 100% dans la mémoire locale du navigateur en JavaScript. Aucune donnée ne quitte votre poste de travail.

Quelles syntaxes SQL représentent les contraintes uniques composites et clés primaires multiples ?▼

Les annotations @@id multi-colonnes sont converties en clauses PRIMARY KEY (col1, col2) au niveau table, et les @@unique sont compilées en instructions CREATE UNIQUE INDEX selon le dialecte ciblé.

Outils et utilitaires connexes

Tous les outils →
Guide Développeur : Générateur d'Interfaces et Types TypeScript depuis Prisma SchemaDéveloppement

Extrayez les modèles, énumérations, champs optionnels et relations de votre schéma Prisma sous forme d'interfaces TypeScript autonomes sans dépendance au runtime Prisma Client.

Ouvrir l'outil→
Guide Développeur : Générateur de Client API Axios TypeScript depuis OpenAPI et SwaggerDéveloppement

Générez des fonctions de client HTTP Axios sécurisées et typées ainsi que des interfaces de paramètres à partir de spécifications OpenAPI 3.0 et Swagger JSON/YAML.

Ouvrir l'outil→
Guide Développeur du Générateur de Client TypeScript Fetch Natif depuis OpenAPI & SwaggerDéveloppement

Générez des clients d'API TypeScript en fetch natif sans dépendance externe, avec sérialisation des requêtes, en-têtes et typage complet.

Ouvrir l'outil→
Guide Développeur : Générateur de DDL SQL CREATE TABLE depuis Schéma Drizzle ORMDéveloppement

Traduisez fidèlement les définitions pgTable, mysqlTable et sqliteTable de Drizzle ORM en scripts de migration SQL CREATE TABLE exécutables.

Ouvrir l'outil→
Guide de développement pour le générateur de workflows YAML GitHub Actions CI/CDDéveloppement

Créez des pipelines YAML GitHub Actions prêts pour la production pour Node.js, Go, Python, conteneurs Docker, tests unitaires et déploiements automatisés.

Ouvrir l'outil→
Générateur de Configuration Linux Logrotate (Rétention & Compression)Développement

Générez des fichiers de configuration /etc/logrotate.d/ prêts pour la production avec rotation quotidienne/hebdomadaire, compression gzip, dateext, limites de taille et scripts postrotate.

Ouvrir l'outil→