Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Perfect for: Project setup, database initialization, schema-first development, team synchronization
When to Use This Skill
Use this skill when you need to:
Convert blueprint database schema to Prisma/Drizzle/TypeORM code
Generate migration files from architecture design
Create type-safe database access layer
Implement Row-Level Security policies
Set up database indexes for performance
Share schema with frontend/backend teams
Initialize database for new project
Input: domain.entities[] from SDL (primary) — check solution.sdl.yaml first; if absent, check sdl/data.yaml or the relevant sdl/ module — with fallback to manifest shared types and blueprint Section 4
Output: ORM schema files, migration files, seed data
Supported ORMs
1. Prisma (Recommended for Next.js, Node.js)
Output: prisma/schema.prisma,
prisma/migrations/
Why Prisma:
Best TypeScript support (auto-generated types)
Excellent developer experience (Prisma Studio GUI)
Add deletedAt to every table and a withSoftDelete query helper:
// db/schema.ts — add to every tableexportconst tenants = pgTable('tenants', {
// ... existing columns ...deletedAt: timestamp('deleted_at'), // ← add to every table
}, (table) => ({
// ... existing indexes ...deletedAtIdx: index('tenants_deleted_at_idx').on(table.deletedAt),
}));
// db/helpers.tsimport { isNull } from'drizzle-orm';
exportfunction withSoftDelete<T extends { deletedAt: unknown }>(table: T) {
returnisNull(table.deletedAt);
}
// Usage in queries:// db.select().from(tenants).where(withSoftDelete(tenants))// Never call .delete() — use: db.update(tenants).set({ deletedAt: new Date() }).where(eq(tenants.id, id))
3. TypeORM (For Enterprise, Java-like patterns)
Output: src/entities/, src/migrations/
Why TypeORM:
Mature, battle-tested in enterprise
Decorator-based (familiar to Java/Spring developers)
Advanced features (multi-database, replication)
Works with TypeScript and JavaScript
Soft Delete (TypeORM)
Use the built-in @DeleteDateColumn decorator — TypeORM's SoftDelete() and SoftRemove() methods set this column automatically, and all find* queries transparently exclude soft-deleted rows.
tenant_id FK → Tenant → @relation(fields: [tenantId], references: [id])
Add indexes: Performance optimization
Single column: @@index([column])
Composite: @@index([col1, col2])
Unique: @@unique([column])
Add constraints: Cascades, checks, defaults
onDelete: Cascade for multi-tenant isolation
@default(now()) for timestamps
@default(AGENT) for enums
Step 4: Generate Row-Level Security Policies
If multi-tenant B2B SaaS detected, add RLS:
PostgreSQL RLS (SQL):
-- Enable RLS on all tablesALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE tickets ENABLE ROW LEVEL SECURITY;
-- Policy: Users can only see their own tenant's dataCREATE POLICY tenant_isolation_policy ON users
FORALLUSING (tenant_id = current_setting('app.current_tenant_id')::uuid);
CREATE POLICY tenant_isolation_policy ON tickets
FORALLUSING (tenant_id = current_setting('app.current_tenant_id')::uuid);
-- Admins can see all tenants (override policy)CREATE POLICY admin_override_policy ON users
FORALLTO admin_role
USING (true);
-- db/migrations/001_initial_schema.sql-- Create enumsCREATE TYPE user_role AS ENUM ('ADMIN', 'AGENT', 'VIEWER');
CREATE TYPE ticket_status AS ENUM ('OPEN', 'IN_PROGRESS', 'RESOLVED', 'CLOSED');
CREATE TYPE priority AS ENUM ('LOW', 'MEDIUM', 'HIGH', 'URGENT');
-- Create tablesCREATE TABLE tenants (
id UUID PRIMARY KEYDEFAULT gen_random_uuid(),
name TEXT NOT NULL,
domain TEXT NOT NULLUNIQUE,
created_at TIMESTAMPTZ NOT NULLDEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULLDEFAULT NOW()
);
CREATE INDEX tenants_domain_idx ON tenants(domain);
CREATE TABLE users (
id UUID PRIMARY KEYDEFAULT gen_random_uuid(),
tenant_id UUID NOT NULLREFERENCES tenants(id) ONDELETE CASCADE,
email TEXT NOT NULL,
name TEXT,
role user_role NOT NULLDEFAULT'AGENT',
created_at TIMESTAMPTZ NOT NULLDEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULLDEFAULT NOW(),
UNIQUE(tenant_id, email)
);
CREATE INDEX users_tenant_idx ON users(tenant_id);
CREATE INDEX users_email_idx ON users(email);
[... more tables ...]
-- Enable Row-Level SecurityALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE tickets ENABLE ROW LEVEL SECURITY;
-- RLS PoliciesCREATE POLICY tenant_isolation_policy ON users
FORALLUSING (tenant_id = current_setting('app.current_tenant_id')::uuid);
[... more policies ...]
Output Format
When invoked, generate:
🗄️ Generating data model from blueprint...
✅ Detected ORM: Prisma (from Next.js tech stack)
✅ Parsed database schema (5 entities, 12 relationships)
- Entities: Tenant, User, Ticket, Comment, Attachment
- Relationships: 8 one-to-many, 4 many-to-many
- Indexes: 15 (performance optimized)
- Constraints: 8 cascade deletes
✅ Generated prisma/schema.prisma (287 lines)
✅ Generated prisma/seed.ts (sample data)
✅ Generated prisma/middleware.ts (RLS for multi-tenancy)
✅ Generated db/rls-policies.sql (PostgreSQL RLS)
📦 Next steps to initialize database:
1. Install Prisma:
npm install prisma @prisma/client
npm install -D tsx
2. Generate Prisma Client:
npx prisma generate
3. Run initial migration:
npx prisma migrate dev --name init
4. Seed database with sample data:
npm run db:seed
5. Open Prisma Studio (database GUI):
npx prisma studio
🔒 Multi-tenancy configured:
- All queries automatically scoped by tenant_id
- Row-Level Security policies enabled
- Cascade deletes configured
- Sample middleware for app-level isolation